创建与扩展方法同名的静态方法?

Create static method with same name as extension method?

我创建了一个名为 IsOccluded 的扩展方法。我试图在同一个代码文件中创建一个具有相同名称和参数但不是扩展名的静态方法:

public static bool IsOccluded(Vector2 point, Matrix world) { }
public static bool IsOccluded(this Vector2 point, Matrix world) { }

但是,由于参数在编译器看来本质上是一样的,所以这是不允许的。这让我觉得很奇怪,因为它们的称呼不同:

Vector2 position;
Matrix world;
Rendering2D.IsOccluded(position, world);
position.IsOccluded(world);

我已将非扩展方法的名称更改为 IsPointOccluded 以消除错误,而且它看起来更清晰了。但这引出了我的问题:


它们似乎是具有两个不同签名的两个不同方法,那么为什么编译器会报错?

我知道以下无法编译,因为签名完全相同:

public void X(int y, double j) { }
public void X(int a, double z) { }

我是否遗漏了这个主题的核心概念?

只需要一种方法,可以作为扩展或常规方法使用:

考虑以下有效代码:

public static class Rendering3D
{
    public static bool IsOccluded(this Vector2 point, Matrix world) { }
}

static void Main()
{
    Matrix world = ...
    Vector2 point = ...
    if( point.IsOccluded(world) )
    {
    }
    if( Rendering3D.IsOccluded(point, world) )
    {
    }
}

他们不是

essentially the same

他们是一样的。

两者都是具有相同类型的相同参数的静态方法,并且两者的调用方式完全相同,除了带有 this 的方法添加了一种额外的调用方式。

public static class Foo
{
    public static void IsOccluded(this Vector2 point, Matrix world) { }
}

此方法是静态和扩展的,这意味着有 1 种额外的调用方式。 首先是通常的方式:

Foo.IsOccluded(new Vector2(), new Matrix);

第二种方法是使用提供给编译器的扩展快捷方式

new Vector2().IsOccluded(new Matrix);