【发布时间】: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