为什么不能在类型T的值上使用Nullable <T>的扩展名?

Sha*_*ica 0 c# extension-methods nullable

我有一个扩展方法:

public static int DoStuff(this MyEnum? enumValue) 
{
  ...
}
Run Code Online (Sandbox Code Playgroud)

我想在一个MyEnum已知不为null 的值上调用它:

MyEnum enumVal = ...
var x = enumVal.DoStuff(); // compiler error!
Run Code Online (Sandbox Code Playgroud)

错误:

错误CS1928:'MyEnum'不包含'DoStuff'的定义,最好的扩展方法重载'MyExtensions.DoStuff(MyEnum?)'有一些无效的参数

我可以通过声明扩展的重载来解决它:

 public static int DoStuff(this MyEnum enumValue)
 {
     return DoStuff((MyEnum?)enumValue); 
 }
Run Code Online (Sandbox Code Playgroud)

或者,我可以显式调用扩展类:

var x = MyExtensions.DoStuff(enumVal);
Run Code Online (Sandbox Code Playgroud)

但这不直观.为什么不能Nullable<T>接受一个类型的扩展T,就像任何正常的方法签名一样?

gre*_*k40 5

基本上,扩展方法(与方法参数不同)不考虑隐式转换.并且MyEnum? value = nonNullableMyEnumValue正在使用隐式转换,它不是同一类型.您将遇到与任何其他隐式可转换类型相同的情况.