我有一个扩展方法:
public static int DoStuff(this MyEnum? enumValue)
{
...
}
我想在MyEnum
的值上调用它,这个值已知为非null:
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
类型的值,就像任何正常的方法签名一样?
答案 0 :(得分:5)
基本上,扩展方法(与方法参数不同)不考虑隐式转换。并且MyEnum? value = nonNullableMyEnumValue
正在使用隐式转换,它不是同一类型。您将遇到与任何其他隐式可转换类型相同的情况。