たまたま .net フレームワークのソース コードを調べたところ、Nullable 構造体の実装に対する明示的な演算子の実装に出くわしました。以下のスクリーンショットは、Value プロパティの実装と明示的な演算子の実装を示しています。また、明示的な演算子が Nullable から T に変換しようとしていることも理解しています。私の質問は、次のコードが例外をスローしていないのはなぜですか?
フレームワークの実装
public T Value {
get {
if (!HasValue) {
ThrowHelper.ThrowInvalidOperationException(ExceptionResource.InvalidOperation_NoValue);
}
return value;
}
}
public static explicit operator T(Nullable<T> value) {
return value.Value;
}
顧客コード
int? i = null;
int? i2 = (int?)i; //No Error
int? i = null;
int i2 = (int)i; //Runtime error
それはvalue.Valueと言い、理想的にはHasValueがfalseになるため(nullを割り当てたため)、無効な操作例外をスローする必要がありますが、値をi2に喜んで割り当てます。ただし、(int?)i の代わりに (int)i に変更すると、Value プロパティから InvalidOperatorException が発生します。私の考えでは、 value.Value が呼び出されると、そのプロパティがアクセスされ、その仕事をするため、例外がスローされます。
同じことを明確にしてください
ありがとう、
サイ・パヴァン