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

问题描述:

我有一个扩展方法:为什么不能在T类型的值上使用Nullable <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); 
} 

或者,我可以明确地调用扩展类:

var x = MyExtensions.DoStuff(enumVal); 

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

+3

原因'MyEnum'不能为空 – Rahul

+1

它们不是同一类型。 –

+0

除了'Nullable '绝对不是'T'。 –

基本上,扩展方法(与方法参数相反)不考虑隐式转换。而MyEnum? value = nonNullableMyEnumValue正在使用隐式转换,它不是同一类型。你会遇到与其他隐式可转换类型相同的情况。