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