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

时间:2019-01-21 20:58:58

标签: c# extension-methods static-methods

我创建了一个名为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) { }

我是否缺少这个主题的核心概念?

2 个答案:

答案 0 :(得分:3)

它们不是

  

基本上相同

它们是相同的。

这两个都是静态方法,它们具有相同的参数,具有相同的类型,并且都被称为相同的精确方法,只是带有this的方法增加了一种调用方法。

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

此方法是静态AND扩展,这意味着另外一种调用方法。 首先是通常的方式:

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

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

new Vector2().IsOccluded(new Matrix);

答案 1 :(得分:2)

只需要一种方法,就可以将其用作扩展或常规方法:

请考虑以下有效代码:

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) )
    {
    }
}
相关问题