web-dev-qa-db-ja.com

Nullable <T>オブジェクトの.Valueのキャストと呼び出しに違いはありますか?

Null許容変数があるとします。

_int? myVar = null;
_

その値を使用したい場合、少なくとも2つのオプションがあります。

明示的なキャスト

_DoSomething((int)myVar);
_

_Nullable<T>_の_.Value_プロパティを呼び出す

_DoSomething(myVar.Value);
_

変換が失敗すると、どちらの場合も同じ例外がスローされることに気づきました(_System.InvalidOperationException: Nullable object must have a value_)。これらは両方とも同じ方法で実装されていると思います(しかし、その主張の証拠は見つかりませんでした)。 。

私の質問は:

  • これら2つのオプションに違いはありますか? (つまり、彼らが異なる動作をするいくつかのシナリオがありますか?)
  • スタイル的には、これらの2つのオプションのどちらが他よりも優先されますか?どうして?どのスタイルガイドによると?

更新

明らかかもしれませんが、この質問に出くわした場合に備えて、明示的なキャストに対する_.Value_の利点は、誤って誤った型にキャストしようとしないようにすることであると考えるかもしれません。

一方、明示的なキャストは、一部のシナリオでは読みやすい場合があります。たとえば、var value = (int)myVar;を使用すると、_var value = myVar.Value;_よりも型を簡単に識別できます

6
Sam

Nullable<T> のソースをチェックアウトすると、明示的なキャスト演算子がこれを実行することがわかります。

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

そして、そのValueプロパティが行うこと:

public T Value {
    get {
        if (!hasValue) {
            ThrowHelper.ThrowInvalidOperationException(ExceptionResource.InvalidOperation_NoValue);
        }
        return value;
    }
}

つまり、キャストはプロパティを呼び出し、プロパティによって例外がスローされます。したがって、2つのオプションに違いはありません。

スタイルに関しては、私たちは主観になります。どちらも有効であり、どちらも型の設計者によって明示的に許可されています。プロパティオプションを使用することを選択しますが、それは純粋に個人的な選択です。

11
David Arno