代码之家  ›  专栏  ›  技术社区  ›  Hazel へいぜる

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

  •  0
  • Hazel へいぜる  · 技术社区  · 6 年前

    我创建了一个名为 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 回复  |  直到 6 年前
        1
  •  3
  •   Franck    6 年前

    它们不是

    基本上是一样的

    它们是一样的。

    这两种方法都是具有相同参数、具有相同类型的静态方法,并且除了具有 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);
    
        2
  •  2
  •   John Alexiou    6 年前

    只需要一个方法,它可以用作扩展或常规方法:

    请考虑以下有效代码:

    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) )
        {
        }
    }