2011-10-28 7 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 

明らかにそれはboolean型にContentLength = 0を評価されています。 OrElseは両側にブール値があると仮定すると、なぜIsCancelledが暗黙的にブール値に変換されないのですか?

IsTrueIsFalseOr、およびAndオペレータは、この問題を解決しません。私はOption ExplicitとOption Strictを有効にしています。

+0

このコードは、あなたが私に懸命に働いているようです。なぜIsCancelled公共財産を使用しないのですか?この場合、Do Can not Is Cancelled.IsCancelled(そこに残念なパラメータ名)があります。 –

+0

これは* C#で動作することに注意してください。 –

+1

@ConradFrix。純粋に喘息。おそらく 'Token.IsCancelled'のようなものに落ちるでしょうが、なぜこれがうまくいかないのか不思議です。 –

答えて

1

最初に、がC#でをちょうど使っていることに注意してください。だから、

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

source

:に加えて、おそらくIsTrue()IsFalse()を追加しかし、この場合 VBコンパイラがIsTrue/IsFalse演算子を使用したいことがありますOr()(最初はOr()なしで試してみましたが)。

+0

VB.Netはいくつの無制限の制限を設けてこの機能を実装しますか? VB.Netは言う: 'Public Shared Operatorまたは(As As CancellationToken、b As Boolean)As Booleanの戻り値とパラメーターの型は' OrElse '式で' CancellationToken 'を使用する必要があります。私が始めた次の新しいプロジェクト、私はC#でクラッシュコースを取っています... –

+0

「それはC#で動作します」という理由で受け入れられました。 :-)私が思いついた最善の選択肢は、 'IsEnseまたは' IsCancelled Or ContentLength = 0'のように 'OrElse'の代わりに' Or'を使うことです。 –