Есть ли способ определить оператор неявного преобразования в VB.NET? - PullRequest
24 голосов
/ 21 августа 2009

В C # вы можете использовать ключевое слово implicit , чтобы определить неявный пользовательский оператор преобразования типов.

В VB.NET вы можете определить оператор преобразования CType , который будет явно преобразовывать определенный пользователем тип в другой тип.

Есть ли способ объявить оператор неявного преобразования в VB.NET?

Кажется, я не могу найти какую-либо информацию по этому вопросу ...


Ответ

Я нашел свой ответ в документации MSDN для оператора Widening. По-видимому, оператор CType Widening «вызывается» для неявных преобразований, тогда как оператор CType Narrowing вызывается для явных преобразований.

Сначала я думал, что эта документация неверна, поскольку во время тестирования у меня возникла исключительная ситуация. Я перепроверил и обнаружил что-то очень странное. Функция, которую я реализовал как расширяющий оператор преобразования, прекрасно работает, когда неявное приведение выполняется с помощью оператора "=".

Например, следующее неявно приведёт тип Something к MyClass. Он вызывает мою реализацию преобразования Widening правильно, и все работает без ошибок:

Dim y As Something
Dim x As MyClass = y

Однако, если неявное приведение выполняется в цикле foreach, оно не работает.

Например, следующий код вызовет исключение (" Невозможно привести объект типа 'Something' к типу 'MyClass' "), когда тип Something неявно приведен к MyClass в цикле For Each:

 Dim anArrayOfSomethingTypes() As Something  = getArrayOfSomethings()
 For Each x As MyType In anArrayOfSomethingTypes 
  ....
 Next

Любое понимание этого очень ценится.

1 Ответ

31 голосов
/ 21 августа 2009

В VB.NET используйте оператор Widening CType для создания неявного преобразования:

Class C1
    Public Shared Widening Operator CType(ByVal p1 As C1) As C2

    End Operator
End Class

Обратное явное преобразование может быть сделано путем замены Narrowing на Widening в приведенном выше определении.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...