public static class Extension
{
public static void Test(this DateTime? dt)
{
}
}
void Main()
{
var now = DateTime.Now;
Extension.Test(now); // ok
now.Test(); // compile time error
}
我只是好奇,为什么编译器在作为扩展调用时无法解析相同的方法?
A DateTime
is 不可转换为 Nullable<DateTime>
明确地。
C# 规范,7.6.5.2 扩展方法调用:
如果满足以下条件,则扩展方法符合条件:
- 当作为静态方法应用于参数时,Mj 是可访问和适用的,如上所示
- 存在从 expr 到 Mj 第一个参数的类型的隐式标识、引用或装箱转换。
...
如果在任何封闭的命名空间声明或编译单元中都找不到候选集,则会发生编译时错误。
所以你必须投射DateTime
to Nullable<DateTime>
明确地或从一开始就使用可空值:
DateTime now = DateTime.Now;
((DateTime?)now).Test();
or
DateTime? now = DateTime.Now;
now.Test();
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)