Настройка (в VB результаты на C# отличаются и включены в статью позже):
Код: Выделить всё
Public Class SomeClass
Public Property SomeProperty() As String
Get
Return String.Empty
End Get
Set(ByVal value As String)
End Set
End Property
End Class
Public Class SomeOtherClass
Public Sub New()
Dim sc As New SomeClass()
Me.SomeFunction(sc.SomeProperty)
End Sub
''' The param as Object fn() '''
Public Sub SomeFunction(ByVal param As Object)
End Sub
''' The param as T fn() '''
Public Sub SomeFunction(Of T)(ByRef param As T)
End Sub
End Class

и, не на удивление, это также то, что вызывается во время выполнения.
Итак, я думаю, первый вопрос, который у меня возник, заключается в том, почему был Шаблонная перегруженная версия функции ByRef, выбранная вместо перегруженной версии функции ByVal Object? Я предполагаю, что компилятор и IntelliSense просто отдают предпочтение шаблонным версиям, а не нешаблонным версиям. Во время выполнения фактически вызывается шаблонная версия функции ByRef. (Это не дефект, это просто личный вопрос.)
Теперь внесите небольшое изменение в свойство SomeProperty, например что установщик теперь является частным:
Код: Выделить всё
Public Property SomeProperty() As String
Get
Return String.Empty
End Get
Private Set(ByVal value As String)
End Set
End Property
< img alt="alt text" src="https://dl.dropbox.com/u/215878/private-vb-eh.png" />
В В этом случае IntelliSense предполагает, что вызывается перегруженная версия функции ByVal Object, однако сообщение об ошибке заключается в том, что метод доступа Set для свойства SomeProperty недоступен, что указывает на то, что компилятор все еще ожидает вызова версия шаблона ByRef. Итак, это мой второй вопрос. Почему Intellisense утверждает одно, а компилятор VB явно пытается что-то другое? Мне кажется, это неправильно. Или я что-то упускаю?
Если вместо частного установщика в SomeProperty свойство было просто помечено как ReadOnly и часть установщика удалена, то Шаблонная версия функции ByRef отображается в IntelliSense и вызывается во время выполнения (без ошибок времени выполнения). Итак, это подводит меня к моему третьему вопросу: почему компилятор VB обрабатывает входные параметры ByRef по-разному для свойств, которые являются ReadOnly и not-ReadOnly, но имеют установщик вне области видимости. в VB Что касается SomeFunction(Of T)(...) в своей текущей области действия, это свойство должно быть таким, как если бы оно было ReadOnly, и я ожидаю, что оно будет вызываться так же, как если бы это свойство было на самом деле ReadOnly. Но вместо этого выдается ошибка сборки.
Что касается третьего вопроса, то при выполнении точно такой же настройки (с помощью установщика Private) C# имеет результат, которого я ожидал.

Здесь вы можно видеть, что IntelliSense утверждает, что вызывается перегрузка функции SomeFunction(Object) и нет ошибки сборки. Во время выполнения фактически вызывается версия SomeFunction(Object). Итак, почему в ситуации VB.NET не вызывается та же самая версия SomeFunction(Object)? Почему VB.NET все еще считает, что необходимо вызвать версию SomeFunction(Of T)(ByRef T)? Похоже, что IntelliSense правильно справляется как с C#, так и с VB.NET, компилятор C# поступает правильно, но компилятор VB.NET по-прежнему убежден, что ему следует вызывать версию шаблона ByRef. Мне кажется, что компилятор C# выбирает одну перегрузку, а компилятор VB.NET выбирает другую перегрузку, в точно такой же ситуации. Я ошибаюсь?
Подробнее здесь: https://stackoverflow.com/questions/212 ... of-scope-p
Мобильная версия