为什么不能对类型 T 的值使用 Nullable<T> 的扩展?
Why can't an extension of a Nullable<T> be used on a value of type T?
我有一个扩展方法:
public static int DoStuff(this MyEnum? enumValue)
{
...
}
我想在已知不为空的 MyEnum
值上调用它:
MyEnum enumVal = ...
var x = enumVal.DoStuff(); // compiler error!
错误:
error CS1928: 'MyEnum' does not contain a definition for 'DoStuff' and the best extension method overload 'MyExtensions.DoStuff(MyEnum?)' has some invalid arguments
我可以通过声明扩展的重载来解决它:
public static int DoStuff(this MyEnum enumValue)
{
return DoStuff((MyEnum?)enumValue);
}
或者,我可以显式调用扩展 class:
var x = MyExtensions.DoStuff(enumVal);
但这是不直观的。为什么 Nullable<T>
的扩展不能像任何普通方法签名一样接受类型 T
的值?
基本上,扩展方法(与方法参数相反)不考虑隐式转换。而MyEnum? value = nonNullableMyEnumValue
是隐式转换,不是同一种类型。您会 运行 遇到与任何其他隐式可转换类型相同的情况。
我有一个扩展方法:
public static int DoStuff(this MyEnum? enumValue)
{
...
}
我想在已知不为空的 MyEnum
值上调用它:
MyEnum enumVal = ...
var x = enumVal.DoStuff(); // compiler error!
错误:
error CS1928: 'MyEnum' does not contain a definition for 'DoStuff' and the best extension method overload 'MyExtensions.DoStuff(MyEnum?)' has some invalid arguments
我可以通过声明扩展的重载来解决它:
public static int DoStuff(this MyEnum enumValue)
{
return DoStuff((MyEnum?)enumValue);
}
或者,我可以显式调用扩展 class:
var x = MyExtensions.DoStuff(enumVal);
但这是不直观的。为什么 Nullable<T>
的扩展不能像任何普通方法签名一样接受类型 T
的值?
基本上,扩展方法(与方法参数相反)不考虑隐式转换。而MyEnum? value = nonNullableMyEnumValue
是隐式转换,不是同一种类型。您会 运行 遇到与任何其他隐式可转换类型相同的情况。