为什么Enum上的HasFlag扩展方法胜过Enum.HasFlag?

时间:2015-07-29 17:44:31

标签: c# enums extension-methods

如果我在Enum上创建一个名为HasFlag的扩展方法,每当我尝试在枚举实例上调用HasFlag时,它都使用扩展方法,而不是实例方法。为什么呢?

public static class Extensions
{
  public static bool HasFlag(this Enum e)
  {
    return false
  }
}

使用代码:

public enum Foo
{
  A, B, C
}

public void Whatever()
{
  Foo e = Foo.A;
  if (e.HasFlag())
  {
    // ...
  }
}

编译为:

public void Whatever()
{
  Foo e = Foo.A;
  if (Extensions.HasFlag(e))
  {
    // ...
  }
}

为什么编译器不使用Enum.HasFlag实例方法?

1 个答案:

答案 0 :(得分:1)

扩展方法使您可以向现有类型“添加”方法,而无需创建新的派生类型,重新编译或以其他方式修改原始类型。扩展方法是一种特殊的静态方法,但它们被称为扩展类型的实例方法。对于用C#和Visual Basic编写的客户端代码,调用扩展方法和实际在类型中定义的方法之间没有明显区别。

扩展方法不能在实例主方法上覆盖,也不知道要调用哪个方法:

  

以下方法之间的调用不明确

解决此问题的唯一方法是使用常规静态方法语法调用扩展方法。所以不要这样:

e.HasFlag();

你必须这样做:

Extensions.HasFlag(e);

但是如果你在扩展方法中添加其他参数,那么它与main方法不同,所以当你调用HasFlag方法时,实际调用了扩展方法。例如:

public static bool HasFlag(this Enum e, bool isNullable)
{
    return false;
}

参考文献:

Extension Methods (C# Programming Guide)

Extension Methods, Nulls, Namespaces and Precedence in C#