【问题标题】:Why can't an extension of a Nullable<T> be used on a value of type T? [duplicate]为什么不能在 T 类型的值上使用 Nullable<T> 的扩展? [复制]
【发布时间】:2017-09-13 20:40:25
【问题描述】:

我有一个扩展方法:

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

我想在已知不为空的MyEnum 值上调用它:

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);

但这并不直观。为什么Nullable&lt;T&gt; 的扩展不能像任何普通方法签名一样接受T 类型的值?

【问题讨论】:

  • 因为MyEnum 不可为空
  • 它们不是同一类型。
  • 除了Nullable&lt;T&gt; 绝对不是T
  • @Rahul 如果我有一个普通方法void DoStuff(MyEnum? enumVal) {},我可以调用它传递一个MyEnum 类型的值。
  • @ShaulBehr 这相同。你也可以用同样的方式使用MyStaticClass.DoStuff(enumValue)。这是有效的,因为该值已转换Nullable&lt;MyEnum&gt;。扩展方法虽然适用于具体类型。编译器正在寻找与类型完全匹配的扩展方法,而不是通过隐式转换

标签: c# extension-methods nullable


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2017-04-01
    • 2015-08-12
    • 1970-01-01
    • 1970-01-01
    • 2020-05-25
    • 1970-01-01
    • 1970-01-01
    • 2020-11-22
    • 2014-05-06
    相关资源
    最近更新 更多