2011-10-28 47 views
2

我試圖將一個布爾值框分享給我的代碼。我在使用加寬運算符(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」定義「布爾」。

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。

+0

此代碼看起來像你在努力工作給我。爲什麼不使用IsCancelled公共屬性。在這種情況下,「直到IsCancelled.IsCancelled」(不幸的參數名稱) –

+0

請注意,它*只是在C#中工作* ... –

+1

@ConradFrix。純粹的美學。我可能會退回到像Token.IsCancelled',但我很好奇,爲什麼這不起作用。 –

回答

1

首先,請注意它只是在C#中工作。然而,它有可能在這種情況下 VB編譯器要使用IsTrue/IsFalse運營商:

Overloading the Or and IsTrue operators affects the behavior of the OrElse operator.

source

所以:除了添加IsTrue()IsFalse(),也許Or()(儘管我會先嚐試沒有Or())。

+0

VB.Net想要加入這個特性有多少無意義的限制? VB.Net說:'公共共享運算符或(a作爲CancellationToken,b作爲布爾)的返回和參數類型作爲布爾'必須是'CancellationToken'用於'OrElse'表達式。我開始的下一個新項目,我正在C#中進行速成課...... –

+0

接受的理由是「它只是在C#中工作」。 :-)我提出的最好的選擇是使用'Or'而不是'OrElse',就像'IsCancelled或ContentLength = 0'一樣。 –