4
int normal;
int? nullable;
var x = normal/nullable; // expression evaluates to Nullable<int>
var y = nullable/normal; // also Nullable<int>

編集:私の最初の質問は、私が探していない種類の回答に少し魅力的でした。タイトルは実際に質問を要約しており、それを説明するために使用された例は適切に選択されていません.

上記の場合、コンパイラーには 1 つの可能性しかありません: int.divide 演算子は null 許容の int オペランドをサポートしていません、int? あり、それで解決します。あいまいさはなく、いかなる種類のプレゼンス ルールも必要ありません。

しかし、同じ演算子をオーバーロードする 2 つの型 (たとえば、除算) があり、両方がオペランドの 1 つとして他の型をサポートしている場合はどうなるでしょうか?

ここには実際には 2 つの質問があります。

1) 両方の型が Type1/Type2 と Type2/Type1 をサポートしている場合、コンパイラは Type1 または Type2 のどちらの演算子を使用するかをどのように決定しますか? 左から右への優先順位 (バイナリ操作の場合) または何か他のものはありますか?

2) 対称性などの操作に関する仮定はありますか? 言い換えれば、A + B は常に B + A に等しい必要がありますか、それとも型次第ですか?

多くの実用的なシナリオでは、メソッドの任意のフレーバー (仮想メソッド、通常のインスタンス メソッド、または静的な「ユーティリティ」メソッドが演算子に最もよく似ている場合でも) を使用して、同じ終わり。また、通常のメソッド構文の代わりに演算子を使用することで得られるはるかに読みやすい構文を有効にすることで得られる真の価値がある場合もあります。(そもそも言語に演算子がある唯一の理由は構文です。結局のところ、それは単なるメソッドです。)

4

1 に答える 1

2

コンパイラは、適用されるのは通常の int の演算子ではなく、null 許容型の除算演算子であるとどのように判断しますか?

「通常の」演算子を適用できなかったためです。
もちろん、これは通常の演算子を使用します。

 var x = normal/nullable.Value;

ただし、通常と nullable を組み合わせる場合は、nullable が「不明」であることを考慮してください。いくらx + unknownですか?また不明です。また、結果はnull式の結果の型になる可能性があるため、null 許容にする必要があります。

于 2012-10-25T09:27:58.543 に答える