Использование расширяющего оператора логического типа - PullRequest
2 голосов
/ 28 октября 2011

Я пытаюсь создать булево значение, чтобы поделиться им со своим кодом. У меня проблемы с использованием оператора расширения (неявного оператора в C #) для простых вещей.

Public Class CancellationToken

    Public Property IsCancelled As Boolean

    Public Shared Widening Operator CType(a As CancellationToken) As Boolean
        Return a.IsCancelled
    End Operator
End Class

Следующий код работает нормально:

Sub DoIt(IsCancelled As CancellationToken)
    Do Until IsCancelled
        ...
    Loop
End Sub

Но этот блок сообщает об ошибке времени компиляции: оператор 'Or' не определен для типов 'CancellationToken' и 'Boolean'.

Sub DoIt(IsCancelled As CancellationToken)
    Dim ContentLength As Long = ...
    Do Until IsCancelled OrElse ContentLength = 0
        ...
    Loop
End Sub

Очевидно, что ContentLength = 0 оценивается как логическое значение. Если OrElse ожидает логическое значение с каждой стороны, почему IsCancelled неявно преобразуется в логическое значение?

Создание операторов IsTrue, IsFalse, Or и And также не устраняет проблему. У меня есть Option Explicit и Option Strict.

1 Ответ

1 голос
/ 28 октября 2011

Во-первых, обратите внимание, что просто работает в C #. Однако, возможно, что в этом случае компилятор VB хочет использовать операторы IsTrue / IsFalse:

Перегрузка операторов Or и IsTrue влияет на поведение оператора OrElse.

( источник )

Итак: добавьте IsTrue() и IsFalse(), возможно в дополнение к и Or() (хотя я бы попробовал без Or() сначала).

...