为什么不能将Nullable <t>的扩展用于类型T的值?

时间:2017-09-13 12:20:44

标签: c# extension-methods nullable

我有一个扩展方法:

public static int DoStuff(this MyEnum? enumValue) 
{
  ...
}

我想在MyEnum的值上调用它,这个值已知为非null:

MyEnum enumVal = ...
var x = enumVal.DoStuff(); // compiler error!

错误:

  

错误CS1928:&#39; MyEnum&#39;不包含&#39; DoStuff&#39;的定义和最好的扩展方法重载&#39; MyExtensions.DoStuff(MyEnum?)&#39;有一些无效的论点

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

 public static int DoStuff(this MyEnum enumValue)
 {
     return DoStuff((MyEnum?)enumValue); 
 }

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

var x = MyExtensions.DoStuff(enumVal);

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

1 个答案:

答案 0 :(得分:5)

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