我该如何解决这种歧义?

时间:2011-10-25 00:08:23

标签: c#

我正在尝试使用同名的字段和方法。

class Foo {
    String Bar;
    String Bar() { return "woo"; }
}

Error 8 Ambiguity between 'Foo.Bar' and 'Foo.Bar()'

我可以在不Bar()扩展方法的情况下执行此操作吗?例如,这可行

class Foo {
    String Bar;
}

public class Woo {
    public static String Bar(this Foo) { return "woo"; }
}

6 个答案:

答案 0 :(得分:10)

你做不到。您可能能够找到与您一样的变通方法,但是从表面上看the C# spec explicitly forbids this

  

方法的名称必须与同一类中声明的所有其他非方法的名称不同。此外,方法的签名必须与同一类中声明的所有其他方法的签名不同。

答案 1 :(得分:2)

你不能,所以只是......不要对方法和字段使用相同的名称。在任何实际意义上它当然都没有必要,并且无论如何都会造成令人困惑的API。你正试图解决一个不存在的问题恕我直言。

答案 2 :(得分:2)

这个问题似乎涉及从数据库生成的实体。这个问题(由我)询问了该物业的名称。

  

制作(如在汽车制造中),以及许多其他

似乎该属性的合理名称。毕竟, Make 是它的可接受名称。我不会改变它。虽然通常是动词,但在此用法中它是可接受的名词。为此,我也不会尝试在该类中使用该名称定义方法(动词),原因有两个。

  1. 汽车是否知道如何建造自己?它知道如何制造另一辆车或其他任何东西吗?汽车没有任何东西。肯定会有你的位置。但这辆车是自己的工厂吗?一辆车制成。我认为你需要为这个东西创建一个抽象。

  2. 更普遍适用的是,理想情况下,从数据库生成的实体应保留为封装数据的对象。保持业务逻辑与它们分离。您不应该在模型中使用与属性同名的方法,即使这些属性命名不佳(我不认为 Make ),因为您的模型根本不应该有任何* 方法。通过不首先创建歧义来解决歧义。

  3. *当然有例外情况,但要尽量使这些例外而不是规则。

答案 3 :(得分:1)

无法完成。

来自http://msdn.microsoft.com/en-us/library/aa691107%28v=vs.71%29.aspx

  

声明空间永远不能包含同名的字段和方法

答案 4 :(得分:1)

同一个类/结构中的字段,属性和方法不能具有相同的名称  你需要重命名一个或另一个。

答案 5 :(得分:0)

没有。您不能使用相同名称的字段/方法。

但是,如果由于界面要求(我猜你可能想要)而绝对需要这个,那么你可以使用explicit interface implementations解决任何歧义。