3

たまたま .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 が呼び出されると、そのプロパティがアクセスされ、その仕事をするため、例外がスローされます。

同じことを明確にしてください

ありがとう、

サイ・パヴァン

4

4 に答える 4

2
int? i2 = (int?)i;

int?からへの単純なコピー操作int?です。変換演算子は含まれません。これは、struct変数のメモリ内容のフラットコピーです。

于 2012-10-27T10:55:00.543 に答える
2

にキャストし、キャストしint?ないためint

public static explicit operator T(Nullable<T> value) { 
    return value.Value; 
}

Tintですが、キャストしてint?いるので、Value呼び出されたことはありません。

于 2012-10-27T10:49:19.367 に答える
1

の場合、 notint? i2 = (int?)i; //No Errorにキャストしているため、明示的な演算子メソッドがiで呼び出されることはありint?ませんint

于 2012-10-27T10:54:34.660 に答える
0

明示的な演算子に混乱している可能性があります。

「明示的な演算子」ではなく、「明示的な演算子 T」です。あなたの場合、T は int であるため、「明示的な演算子 int」になります。

明示的な演算子 int は、明示的に int に変換する場合にのみ呼び出されます (手がかりは名前にあります ;-) )。

したがって、前述のように、i1 は int への変換を必要とせず、明示的な演算子 int は呼び出されません。

于 2012-10-28T09:03:10.293 に答える