Nullable< T&gt ;:オーバーロード演算子、ブール? &ブール

StackOverflow https://stackoverflow.com/questions/303181

  •  08-07-2019
  •  | 
  •  

質問

  1. 演算子 '&'の理由bool?に定義され、演算子 '&&'じゃない?
  2. これは1)どの程度正確ですか? &ブール?および2)ブール?とbool work?

その他の「興味深い」ものNullableの演算子セマンティクス?ジェネリックTのオーバーロード演算子はありますか?

役に立ちましたか?

解決

Nullable< T> の演算子は" lifted&quot ;;演算子。つまり、Tに演算子がある場合、Tですか? 「持ち上がる」となるでしょうカウンターパート。

&&および||実際には&と同じ意味での演算子ではありませんと| -たとえば、オーバーロードすることはできません-ECMA仕様14.2.2からの演算子のオーバーロード:

  

オーバーロード可能なバイナリ演算子は次のとおりです。   +-* /%& | ^<< >> ==!=> < > =< =上記の演算子のみが   過負荷。特に、そうではありません   メンバーアクセスをオーバーロードする可能性、   メソッド呼び出し、または=、&&、||、   ??、?:、チェック済み、チェックなし、新規、   typeof、as、およびis演算子。

同様に、ECMA仕様の14.2.7リフトオペレーターから、リフトオペレーターは次のとおりです。

  

単項演算子の場合   + ++--! 〜

     

二項演算子の場合   +-* /%& | ^<< >>

     

等値演算子の場合   ==!=

     

関係演算子の場合< > < => =

したがって、基本的に、短絡演算子はリフト演算子として定義されていません。

[編集:ベビーベッドシートを追加]

  • リフト演算子:Tの演算子に基づいて、 Nullable< T> でコンパイラが提供する演算子。たとえば、 int " +"オペレーターが「持ち上げられ」ます次のように定義された int?へ:

    (int?x、int?y)=> (x.HasValue&& y.HasValue)? (x.Value + y.Value):(int?)null;

  • 演算子のオーバーロード:特定の型のカスタム演算子実装を提供する行為。たとえば、 decimal および DateTime はさまざまな演算子のオーバーロードを提供します

  • ショートサーキット:&& および || の通常の動作(C ++およびC#を含む多くの言語で)-つまり、第2オペランド評価されない可能性がある-つまり

    (expression1、expression2)=> expression1()? expression2():false;

またはおそらくもっと簡単な例:

bool someFlag = Method1() && Method2();

Method1()がfalseを返す場合、 Method2()は実行されません(コンパイラーは、全体的な答えがfalseであることを既に知っているため)。これは、 Method2()に副作用がある場合に重要です。データベースへの保存として...

他のヒント

bool?

に定義されている短絡演算子(&& ||)はありません

論理AND、包含OR、演算子のみで、次のように動作します:

x        y      x & y   x | y   
true    true    true    true
true    false   false   true
true    null    null    true
false   true    false   true
false   false   false   false
false   null    false   null
null    true    null    true
null    false   false   null
null    null    null    null

演算子"&"はビット単位の演算子です。¨一方、"&&"論理演算子です。 ロジカル「&」演算子はthreestate値に適用できません。twostateの場合のみです。

-さらに、論理&& ||とともに演算子演算子はオーバーロードできません。

2)ビット単位演算子が機能する理由は、単純な1または0である単一ビットで動作するためです。これは、ブール演算子が本質的にtrue、false、1、0であるためです。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top