使用布尔运算的扩展运算符

时间:2011-10-28 05:49:05

标签: .net operators implicit

我正在尝试设置一个布尔值,以便在我的代码中分享它。我在使用扩展运算符(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

但是这个块报告了一个编译时错误:没有为类型'CancellationToken'和'Boolean'定义运算符'Or'。

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

显然,它被评估为ContentLength = 0布尔值。鉴于OrElse期望每边都有布尔值,为什么IsCancelled不会隐式转换为布尔值?

创建IsTrueIsFalseOrAnd运算符也不能解决问题。我启用了Option Explicit和Option Strict。

1 个答案:

答案 0 :(得分:1)

首先,请注意它在C#中正常工作。但是,在这种情况下有可能 VB编译器想要使用IsTrue / IsFalse运算符:

  

重载Or和IsTrue运算符会影响OrElse运算符的行为。

source

所以:添加IsTrue()IsFalse(),可能 Or()之外(尽管我先尝试不使用Or() )。