我发现了一些让我感到惊讶的事情。
我有这个方法
public static string PrintDecimal(decimal? input, string NumberFormat = null){ }
我将这种方法称为
int? MaxFaltas = 0;
Label.Text = CustomConvert.PrintDecimal(MaxFaltas);
为什么这样做有效且没有编译错误。我调用的方法是定义为接收decimal?
int?
答案 0 :(得分:8)
您刚刚发现规范中描述的内容为lifted operators。
只要Nullablt<A>
可以转换为Nullable<B>
,他们就可以将A
转换为B
。
6.4.2提升转化运算符
给定一个用户定义的转换运算符,它从a转换 非可空值类型
S
到非可空值类型T
,已解除 转换运算符存在,可从S?
转换为T?
。这解除了 转化运算符执行从S?
到S
的展开,然后执行 用户定义的从S
到T
的转化,然后是T
的换行 到T?
,除了null
值S?
直接转换为null
值T?
。
答案 1 :(得分:4)
这是有效的,因为int可以隐式转换为小数,因此可以隐式转换可空版本。
FROM TO
int long , float, double, or decimal
https://msdn.microsoft.com/en-us/library/y5b434w4.aspx
http://blogs.msdn.com/b/ericlippert/archive/2007/06/27/what-exactly-does-lifted-mean.aspx