为什么C#成员名称不能与封闭类型名称相同?
在C#中,下面的代码无法编译:为什么C#成员名称不能与封闭类型名称相同?
class Foo {
public string Foo;
}
的问题是:为什么?
更确切地说,我明白,这并不能编译,因为(我引述):
成员名称不能与它们的封闭类型
好,很好。我明白,我不会再做,我保证。
但我真的不明白为什么编译器拒绝采用与封闭类型名称相同的字段。什么是阻止我这样做的根本问题?
严格来说,这是C#强加的限制,最有可能是为了方便语法。一个构造函数有一个方法体,但它在IL中的成员条目表示为“.ctor”,它与普通方法的元数据略有不同(在Reflection类中,ConstructorInfo来自MethodBase,而不是MethodInfo)。我不相信有一个.NET限制可以防止创建一个与外部类型名称相同的成员(甚至是方法),尽管我没有尝试过。
我很好奇,所以我确认它不是.NET的限制。在VB中创建下面的类:
Public Class Class1
Public Sub Class1()
End Sub
End Class
在C#中,其引用为:
var class1 = new Class1();
class1.Class1();
因为Foo被保留为构造函数的名称。
所以如果你的代码被允许 - 你会调用构造函数吗?
即使有可能通过将构造函数视为一种特殊情况并将新规则引入方法/成员绑定来实现此目的,它会是一个好主意吗?这在某些时候不可避免地会导致混乱。
但构造函数不是一种方法或任何东西,它不应该干扰其余的代码。 – 2010-11-01 23:56:06
构造函数是一种方法。你为什么认为它不是?例如。你可以从派生对象中的构造函数中调用它。 – 2010-11-01 23:56:52
@James Gaunt,因为它不返回任何东西,它是[构造函数](http://en.wikipedia.org/wiki/Constructor_%28object-oriented_programming%29)。我不确定它是如何在C#中工作的,但在java中,构造函数与方法无关,只不过它是一段代码。你不用'base()'调用它吗?所以这里也不是问题。 – 2010-11-01 23:58:33
因为成员名称与类的构造函数名称冲突?
有做正确的方式和错误的方式来做到这一点。
为什么C#不允许?
因为它没有理由这么做。为什么你想在你的生活中造成这样的混乱。
我认为CLR允许它,因为另一篇文章以vb.net为例进行了证明,它不应该受到限制,但我不想创建基于CLR操作的相同规则的应用程序。抽象使代码更清晰。我认为这个论证与多重继承的工作水平相同。是的,它可以用某些语言完成,但会造成混淆。因此,我的答案是减少歧义和混淆,并以c#解析器/编译器为基础。 C#团队的设计选择。
这可能是最好的,最完整的答案。在VB中(我想我只是吐了一点在我嘴里)ctor是Sub New()... – 2010-11-02 00:08:10
你的意思是“阻止创建成员”的方式,他在问题中描述它?是的,这就是这个问题的全部原因。如果你的意思是像'public string Foo {get; set;} public void Foo(){}'那么也不允许这样做。 – jcolebrand 2010-11-02 00:08:29
问题是如果C#不允许它,或者.net类型系统不允许它。我想这只是C#。 – CodesInChaos 2010-11-02 00:13:12