次の 3 行のコードは同じだと思います。
public static void TestVarCoalescing(DateTime? nullableDateTime)
{
var dateTimeNullable1 = nullableDateTime.HasValue ? nullableDateTime : DateTime.Now;
var dateTimeNullable2 = nullableDateTime != null ? nullableDateTime : DateTime.Now;
var dateTimeWhatType = nullableDateTime ?? DateTime.Now;
}
いずれの場合も、nullableDateTime
新しい変数に代入します。DateTime?
の型であるため、すべての変数の型が になることを期待しますnullableDateTime
。しかし、驚いたことに、 の型はdateTimeWhatType
になるだけDateTime
なので、nullable ではありません。
さらに悪いことに、ReSharper は 2 番目のステートメントを null 合体式に置き換えて式 3 にすることを提案しています。したがって、ReSharper にその処理を行わせると、変数の型が から に変更さDateTime?
れDateTime
ます。
実際、メソッドの残りの部分では、
if (someCondition) dateTimeNullable2 = null;
ReSharper に 2 番目の式を null 合体バージョンに置き換えるまでは、問題なくコンパイルできます。
AFAIK、交換
somevar != null ? somevar : somedefault;
と
somevar ?? somedefault;
実際、同じ結果が得られるはずです。しかし、null 許容型の暗黙的な型指定の場合、コンパイラは??
それが意味するかのように脅威を与えるようです。
somevar != null ? somevar.Value : somedefault;
したがって、私の質問は、を使用すると暗黙の型が変更される理由と??
、ドキュメントのどこでこれに関する情報を見つけることができるかということだと思います。
??
ところで、これは現実世界のシナリオではありませんが、使用すると (暗黙の) 型が変更される理由を知りたいです。