Ошибка в компиляторе VB и/или IntelliSense как в C#, так и в VB. Наборы свойств вне области действия WRT и параметры ByRC#

Место общения программистов C#
Ответить
Anonymous
 Ошибка в компиляторе VB и/или IntelliSense как в C#, так и в VB. Наборы свойств вне области действия WRT и параметры ByR

Сообщение Anonymous »

Я заметил некоторые, казалось бы, странные проблемы в Visual Studio 2008 (.NET 3.5), а также в Visual Studio 2010 Beta 2 (.NET 4.0). Эти проблемы могли существовать и в предыдущих версиях. Возможно, они не являются проблемой, но в любом случае я хотел бы посмотреть, есть ли для них логические объяснения, прежде чем отправлять отчет в Microsoft Connect.

Настройка (в 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
В этом случае вызов Me.SomeFunction(sc.SomeProperty) с точки зрения IntelliSense выглядит следующим образом:

Изображение

и, не на удивление, это также то, что вызывается во время выполнения.

Итак, я думаю, первый вопрос, который у меня возник, заключается в том, почему был Шаблонная перегруженная версия функции 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
Как только вы это сделаете, со строкой Me.SomeFunction(sc.SomeProperty) произойдет следующее:

< 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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»