【发布时间】:2017-09-13 20:40:25
【问题描述】:
我有一个扩展方法:
public static int DoStuff(this MyEnum? enumValue)
{
...
}
我想在已知不为空的MyEnum 值上调用它:
MyEnum enumVal = ...
var x = enumVal.DoStuff(); // compiler error!
错误:
错误 CS1928:“MyEnum”不包含“DoStuff”的定义,并且最佳扩展方法重载“MyExtensions.DoStuff(MyEnum?)”有一些无效参数
我可以通过声明扩展的重载来解决它:
public static int DoStuff(this MyEnum enumValue)
{
return DoStuff((MyEnum?)enumValue);
}
或者,我可以显式调用扩展类:
var x = MyExtensions.DoStuff(enumVal);
但这并不直观。为什么Nullable<T> 的扩展不能像任何普通方法签名一样接受T 类型的值?
【问题讨论】:
-
因为
MyEnum不可为空 -
它们不是同一类型。
-
除了
Nullable<T>绝对不是T。 -
@Rahul 如果我有一个普通方法
void DoStuff(MyEnum? enumVal) {},我可以调用它传递一个MyEnum类型的值。 -
@ShaulBehr 这不相同。你也可以用同样的方式使用
MyStaticClass.DoStuff(enumValue)。这是有效的,因为该值已转换 为Nullable<MyEnum>。扩展方法虽然适用于具体类型。编译器正在寻找与类型完全匹配的扩展方法,而不是通过隐式转换
标签: c# extension-methods nullable