14

次の 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;

したがって、私の質問は、を使用すると暗黙の型が変更される理由と??、ドキュメントのどこでこれに関する情報を見つけることができるかということだと思います。

??ところで、これは現実世界のシナリオではありませんが、使用すると (暗黙の) 型が変更される理由を知りたいです。

4

2 に答える 2

9

最初の2つの例は、あなたを迷わせています。あなたではなく考慮したほうがいいでしょう

var dateTimeNullable1 = nullableDateTime.HasValue 
    ? nullableDateTime 
    : DateTime.Now;

むしろ

var dateTimeNullable1 = nullableDateTime.HasValue 
    ? nullableDateTime.Value 
    : DateTime.Now;

C#3.0仕様のセクション7.12「null合体演算子」を引用するには(わずかにロープ状のフォーマットについてお詫びします)。

式のa ?? bタイプは、オペランドのタイプ間で使用可能な暗黙の変換によって異なります。優先順位の高い順に、のタイプa ?? bA0、、、AまたはB、です。ここで、はのAタイプa、はのBタイプb( タイプがある場合b)、およびif A0の基になるタイプはnull許容型、またはそれ以外の場合です。AAA

したがって、aNullable<Something>であり、b暗黙的にに変換できる場合Something、式全体の型はになりますSomething。@Damien_The_Unbelieverが示唆しているように、この演算子のポイントはnullを合体させることです!

于 2012-04-16T08:26:34.160 に答える
5

ちょっとの間、すべての言語の弁護士に行きましょう。C# 仕様 (バージョン 4) から:

7.13

式の型はa ?? b、オペランドで使用できる暗黙的な変換によって異なります。の型は優先順で、a ?? bis A0、、Aまたはです。_またはそれ以外。BAaaBbbA0AAA

そのため、??最初の式が null 許容型である場合、最初の式の基になる型を優先するように明示的に定義されています。

一方、 7.14からの言語( を扱う) では、と?:の実際の型についてのみ説明し、これら2 つの型の間の暗黙的な変換について説明します。xyb ? x : y

X から Y への暗黙の変換 (§6.1) が存在し、Y から X への変換が存在しない場合、Y は条件式の型です。

は から への暗黙的な変換をNullable(T)定義し、からへの明示的な変換のみを定義しているため、式全体で可能な唯一の型は です。TNullable(T)Nullable(T)TNullable(T)

于 2012-04-16T10:20:46.590 に答える