Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/332.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/357.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么可以';t可为null的扩展<;T>;是否用于类型为T的值?_C#_Extension Methods_Nullable - Fatal编程技术网

C# 为什么可以';t可为null的扩展<;T>;是否用于类型为T的值?

C# 为什么可以';t可为null的扩展<;T>;是否用于类型为T的值?,c#,extension-methods,nullable,C#,Extension Methods,Nullable,我有一个扩展方法: 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) 
{
  ...
}
我想在
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);

但这是不直观的。为什么不能扩展< <代码>可空< /COD>接受类型<代码> t>代码>的值,就像任何普通方法签名一样?

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

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

因为
MyEnum
不是null,它们不是同一类型。此外
null
肯定不是
t
@Rahul,如果我有一个普通的
void-DoStuff(MyEnum?enumVal){}
,我可以将其称为传递类型为
MyEnum
@ShaulBehr的值,这是不同的。您也可以用同样的方法使用
MyStaticClass.DoStuff(enumValue)
。这是因为该值已转换为可为null的
。但扩展方法对具体类型有效。编译器正在寻找与类型完全匹配的扩展方法,而不是通过隐式转换,因为
MyEnum
不是null,它们不是相同的类型。此外,如果我有一个普通的方法
void DoStuff(MyEnum?enumVal){}
,那么
null
肯定不是
t
@Rahul,我可以将其称为传递类型为
MyEnum
@ShaulBehr的值,这是不同的。您也可以用同样的方法使用
MyStaticClass.DoStuff(enumValue)
。这是因为该值已转换为可为null的
。但扩展方法对具体类型有效。编译器正在寻找与类型完全匹配的扩展方法,而不是通过隐式转换