Ну, платформа.NET действительно имеет понятие участника по умолчанию. Ключевые компоненты являются классом DefaultMemberAttribute и Типом. GetDefaultMembers (). В VB.NET, определяя участника по умолчанию часть синтаксиса языка:
Public Class Sample
Private mValue As Integer
Default Public ReadOnly Property Test(ByVal index As Integer) As Integer
Get
Return index
End Get
End Property
End Class
Использование это как это:
Sub Main()
Dim s As New Sample
Console.WriteLine(s(42))
Console.ReadLine()
End Sub
компилятор реализует это путем испускания [DefaultMember] автоматически. Это однако имеет ограничение, свойство должно иметь индексный аргумент, конкретно для предотвращения неоднозначности синтаксиса. Это ограничение не осуществляется при определении атрибута явно:
<System.Reflection.DefaultMember("AnotherTest")> _
Public Class Sample
Public ReadOnly Property AnotherTest() As Integer
Get
Return 42
End Get
End Property
End Class
, Но что участник по умолчанию только был бы доступен как значение по умолчанию языком, который позволяет такой синтаксис. Для которого я не знаю примера в.NET, это использовалось назад в дни COM, как VB6. Также базовая причина позади VB6, имеющего ключевое слово Набора, это решает неоднозначность и указывает, что "Я имею в виду объект, не свойство объекта по умолчанию". Очень болезненная деталь синтаксиса для многих начинающих программистов Visual Basic тогда.
C# имеет те же самые правила, но не позволяет тот же вид гибкости. Вы, вероятно, видели индексатор прежде:
public class Sample {
public int this[int index] {
get { return index; }
}
}
Этот код также делает выход компилятора [DefaultMember] атрибут. Именованным свойством в том атрибуте является "Объект". И вот почему Вы видите индексатор, зарегистрированный и индексируемый в MSDN Library как "Объект".
В этом примере это вытягивает объект, но не преобразовывает его в целое число.
Brian, я не вижу, почему Ваш желаемый эффект не может быть достигнут с помощью Widening Operator CType
. Код, который Вы показали нам , может быть сделанным работать. Однако остерегайтесь неявных преобразований. Они обычно не хорошая идея.
Нет, это было явно удалено из VB 7.
то, Когда у Вас есть длинная цепочка свойств по умолчанию, зная точно, что будет возвращено, твердо. То, когда и b
и c
имеют Foo
метод, a.Foo(1)
средний a.b.Foo(1)
или a.b.c.Foo(1)
?
настоящая строка над заголовком была Set
. Путем отбрасывания свойств по умолчанию они также смогли отбросить Set
ключевое слово для объектного присвоения.
Существует DefaultProperty
атрибут, таким образом, Ваш пример должен быть корректным, , но это, кажется, для компонентов, которые используются в разработчике Windows Forms.
Для ответа на мой собственный вопрос перегрузка оператора, казалось, была интересным решением здесь.
В конце, это не был подходящий вариант.
я закончил тем, что имел необходимость включить приблизительно 17 методов с 1 строкой, которые означали много места для ошибок. Более важный то, что Вы не можете перегрузить оператор присваивания; перегрузка для =
для равенства, тестирующего только.
поэтому даже с этим, я не могу сказать:
Dim x as Integer = MyObject.Stats(Stat.Health)
... В этом примере это вытягивает объект, но не преобразовывает его в целое число, поэтому конечно, результатом является исключение.
то, В чем я действительно нуждаюсь, является старым добрым сформированным свойством по умолчанию, но я думаю, в те дни закончены.
Вы могли переопределить метод ToString к выходному значению как строка так, чтобы, когда Вы делаете Ответ. Запишите (MyObject), Вы получаете тот же эффект.
Public Overrides Function ToString() As String
Return Me.Value.ToString
End Function
[РЕДАКТИРОВАНИЕ] Теперь, когда я понимаю его лучше, почему не только позволяют добираться непосредственно в значениях содержащих в нем объектов.
Public Class MyClass
Private m_Stats(100) As Stats ' or some other collection'
Public Property StatValue(ByVal stat_number As Integer) As _
Integer
Get
Return m_Stats(stat_number)
End Get
Set(ByVal Value As Integer)
m_Stats(stat_number) = Value
End Set
End Property
End Class