gpt4 book ai didi

c# - 扩展方法与静态方法优先级

转载 作者:可可西里 更新时间:2023-11-01 08:44:26 26 4
gpt4 key购买 nike

考虑以下程序:

class A
{
public static void Foo()
{
}
}

static class Ext
{
public static void Foo(this A a)
{
}
}

class Program
{
static void Main(string[] args)
{
var a = new A();
a.Foo();
}
}

编译失败,错误:

Member 'Test.A.Foo()' cannot be accessed with an instance reference; qualify it with a type name instead

为什么编译器会忽略扩展方法?

最佳答案

不允许您尝试执行的操作。 C# MSDN Extension Method Article特别指出:

You can use extension methods to extend a class or interface, but not to override them. An extension method with the same name and signature as an interface or class method will never be called. At compile time, extension methods always have lower priority than instance methods defined in the type itself.

谢天谢地,这是不允许的,因为维护起来太糟糕了。


编辑:所以人们说静态方法不是实例方法,这是正确的。但是尝试这样做:

class A
{
public static void Foo() {}
public void Foo() {}
}

由于名称歧义,这也不会编译。如果您被允许使用扩展方法,那正是会发生的情况。它会引入完全相同的歧义。现在,鉴于一种方法是静态的,一种是实例的,这是否意味着没有歧义,也许。但在目前的状态下,它确实引入了歧义,这是不允许它的另一个原因。

编辑#2:来自@ErenErsonmez 的评论:

However, as long as the extension method doesn't have the same signature as an instance method, I don't understand how it could ever cause ambiguity with a static method

如果您更改扩展方法的签名,它肯定会起作用。所以以下将起作用:

class A
{
public static void Foo() { }
}

static class Ext
{
public static void Foo(this A me, int i)
{ }
}
class Program
{
static void Main(string[] args)
{
A a = new A();
a.Foo(10);

Console.ReadLine();
}
}

所以看起来问题更像是一个歧义问题,而不是永远不会有与已经存在的方法同名的扩展方法。

关于c# - 扩展方法与静态方法优先级,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9913529/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com