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>
.
我提出的问题是,这是故意的吗?是否有解释为什么会发生这种情况?