我遇到之间的相互作用一些有趣的行为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(不可为空),看看是否编译器将执行类似的操作,但是它没有。
我明白发生了什么,但我不明白它的理由。 此行为是意外,我和似乎很奇怪。 我没有任何成功找到文档中的转换或MSDN上这种行为的任何引用Nullable<T>
这个问题我带来然后,这是故意的,有没有为什么会这样一个解释吗?