【问题标题】:Create static method with same name as extension method?创建与扩展方法同名的静态方法?
【发布时间】:2019-01-21 20:58:58
【问题描述】:

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

我是否缺少有关此主题的核心概念?

【问题讨论】:

  • 您可以像常规方法一样使用扩展方法。 Rendering2D.IsOccluded(position, world); 对两种形式都有效。无需创建两个方法。
  • @ja72 但是为什么要从容器文件中调用扩展方法,例如Extensions.MyExtension;将其从正确的类型中调用不是更有意义吗?
  • 扩展只是添加了一种额外的方式来调用静态方法。它不会改变其他任何东西。
  • 附言。以单词Is... 开头的方法和属性应返回bool。这只是常识,因为他们回答了一个问题。
  • 所以看起来我错过了一个基本事实,即将方法创建为扩展只是为了简单起见添加了一种额外的调用方式。感谢你们花时间做出回应,并至少弄清楚为什么它不能按我预期的方式工作。另外,@ja72 我没有在我的帖子中输入它,但他们确实返回了bool

标签: c# extension-methods static-methods


【解决方案1】:

他们不是

基本一样

它们是相同的。

两者都是静态方法,具有相同的参数,具有相同的类型,并且都以相同的方式调用,除了 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);

【讨论】:

  • @PerpetualJ,也意识到,如果 C# 语言级别的分析不适合您,C# 的目标是构建 .NET 类。在 .NET 中,“扩展方法”只是具有 ExtensionAttribute 的方法,它不会使一种方法与另一种方法完全不同。 C# 有关于创建和调用此类方法的规则。
【解决方案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) )
    {
    }
}

【讨论】:

    猜你喜欢
    • 2012-04-12
    • 1970-01-01
    • 1970-01-01
    • 2012-01-29
    • 2015-08-12
    • 2011-11-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多