为什么 Enum 上的 HasFlag 扩展方法胜过 Enum.HasFlag?
Why does HasFlag extension method on Enum trump Enum.HasFlag?
如果我在枚举上创建一个名为 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
实例方法?
扩展方法使您能够 "add" 现有类型的方法,而无需创建新的派生类型、重新编译或以其他方式修改原始类型。扩展方法是一种特殊的静态方法,但调用它们时就好像它们是扩展类型的实例方法一样。对于用 C# 和 Visual Basic 编写的客户端代码,调用扩展方法和实际在类型中定义的方法之间没有明显区别。
不能在实例主要方法上重写扩展方法,它不知道要调用哪个方法:
The call is ambiguous between the following methods
解决此问题的唯一方法是使用普通静态方法语法调用您的扩展方法。所以不是这个:
e.HasFlag();
你必须这样做:
Extensions.HasFlag(e);
但是如果你在扩展方法中添加其他参数,那么它与主要方法不同,所以当你调用 HasFlag
方法时,实际调用的是扩展方法。例如:
public static bool HasFlag(this Enum e, bool isNullable)
{
return false;
}
参考文献:
如果我在枚举上创建一个名为 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
实例方法?
扩展方法使您能够 "add" 现有类型的方法,而无需创建新的派生类型、重新编译或以其他方式修改原始类型。扩展方法是一种特殊的静态方法,但调用它们时就好像它们是扩展类型的实例方法一样。对于用 C# 和 Visual Basic 编写的客户端代码,调用扩展方法和实际在类型中定义的方法之间没有明显区别。
不能在实例主要方法上重写扩展方法,它不知道要调用哪个方法:
The call is ambiguous between the following methods
解决此问题的唯一方法是使用普通静态方法语法调用您的扩展方法。所以不是这个:
e.HasFlag();
你必须这样做:
Extensions.HasFlag(e);
但是如果你在扩展方法中添加其他参数,那么它与主要方法不同,所以当你调用 HasFlag
方法时,实际调用的是扩展方法。例如:
public static bool HasFlag(this Enum e, bool isNullable)
{
return false;
}
参考文献: