web-dev-qa-db-ja.com

リフトオペレーターとは何ですか?

私は この記事 を見ていて、持ち上げられた演算子を説明するVB.NETの例に従うのに苦労しています。同等のC#の例やチュートリアルはないようです。私は一般的に演算子のオーバーロードの経験があまりないので、null許容型を読みながらVB.NETに相当するものを理解しようとすることは、おそらく始めるのに最適な場所ではありません...

リフトされた演算子と、それらがnull許容型でどのように使用されるかについて誰かが説明できるでしょうか? null許容型自体が演算子をオーバーロードせず、それが表す基になる型の演算子を使用することを意味するだけですか?

SOリフトされたオペレーターについての情報はあまりないようですので、これが他の人にも役立つことを願っています。

59
fletcher

リフト演算子は、null許容でないフォームにすでに存在する演算子を「リフト」することにより、null許容型を処理する演算子です。したがって、たとえば、次の場合:

int? x = 10;
int? y = 10;
int? z = x + y;

その「+」演算子は解除されます。実際にはNullable<int>には存在しませんが、C#コンパイラは存在するかのように動作し、正しいことを行うためのコードを生成します。 (ほとんどの場合、どちらかのオペランドがnullかどうかを確認します。nullの場合、結果はnullです。それ以外の場合は、両方のオペランドをnull不可能な値にアンラップし、通常の演算子を使用して、結果をラップして戻します。 null許容値。ただし、比較に関してはいくつかの特殊なケースがあります。)

詳細については、 C#仕様 のセクション6.4.2(リフトされた変換演算子)および7.3.7(リフトされた演算子)を参照してください。

108
Jon Skeet

リフト演算子を使用すると、null許容でない型に対して機能する事前定義およびユーザー定義の演算子をnull許容フォームにも使用できます。

int i = 5;
int? j = 6;

int? k = j + i;    // 11
int? q = i + null; // null - Shows a warning the result of the expression is always null of type int?
int r = i + null; // Throws an error the result of expression is always null of type int?
0
Nipuna