Nullable
暗黙の変換の間の相互作用でいくつかの興味深い動作に遭遇しました。値型からの参照型の暗黙的な変換を提供するNullable
と、代わりにコンパイルエラーが予想されるときに、参照型を必要とする関数に型を渡すことができることがわかりました。以下のコードはこれを示しています。
static void Main(string[] args)
{
PrintCatAge(new Cat(13));
PrintCatAge(12);
int? cat = null;
PrintCatAge(cat);
}
private static void PrintCatAge(Cat cat)
{
if (cat == null)
System.Console.WriteLine("What cat?");
else
System.Console.WriteLine("The cat's age is {0} years", cat.Age);
}
class Cat
{
public int Age { get; set; }
public Cat(int age)
{
Age = age;
}
public static implicit operator Cat(int i)
{
System.Console.WriteLine("Implicit conversion from " + i);
return new Cat(i);
}
}
出力:
The cat's age is 13 years
Implicit conversion from 12
The cat's age is 12 years
What cat?
から変換コードを削除Cat
すると、予期されるエラーが発生します。
Error 3 The best overloaded method match for 'ConsoleApplication2.Program.PrintCatAge(ConsoleApplication2.Program.Cat)' has some invalid arguments
Error 4 Argument 1: cannot convert from 'int?' to 'ConsoleApplication2.Program.Cat
ILSpyで実行可能ファイルを開くと、生成されたコードは次のようになります。
int? num = null;
Program.PrintCatAge(num.HasValue ? num.GetValueOrDefault() : null);
同様の実験で、変換を削除しPrintCatAge
、コンパイラが同様の操作を実行するかどうかを確認するためにint(null許容ではない)を必要とするオーバーロードを追加しましたが、実行しません。
私は何が起こっているのか理解していますが、その正当性を理解していません。この振る舞いは私には予想外であり、奇妙に思えます。変換またはのドキュメントでMSDNでこの動作への参照を見つけることに成功しませんでしたNullable<T>
。
私が提起する質問は、これは意図的なものであり、なぜこれが起こっているのかという説明がありますか?