Подтвердить что ты не робот

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

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

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

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

Я не могу найти никакой информации об этом....


Ответ

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

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

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

Dim y As Something
Dim x As MyClass = y

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

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

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

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

4b9b3361

Ответ 1

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

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

    End Operator
End Class

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