为什么C#成员名称不能与封闭types名称相同?

在C#中,下面的代码不能编译:

class Foo { public string Foo; } 

问题是:为什么?

更确切地说,我明白这不会编译,因为(我引用):

成员名称不能与其封闭types相同

好的。 我明白,我不会再做,我保证。

但我真的不明白为什么编译器拒绝采取与封闭types具有相同名称的任何字段。 什么是阻止我这样做的根本问题?

严格来说,这是C#强加的限制,最有可能是为了方便语法。 一个构造函数有一个方法主体,但是它在IL中的成员条目被表示为“.ctor”,并且与正常方法有稍微不同的元数据(在Reflection类中,ConstructorInfo从MethodBase而不是MethodInfo派生)我不相信有一个.NET限制,防止创build一个成员(甚至是一个方法)与外部types相同的名称,但我没有尝试过。


我很好奇,所以我确认这不是.NET限制。 在VB中创build以下类:

 Public Class Class1 Public Sub Class1() End Sub End Class 

在C#中,您将其引用为:

 var class1 = new Class1(); class1.Class1(); 

因为Foo被保留为构造函数的名字。

所以如果你的代码被允许的话 – 你会怎样调用构造函数?

即使有可能通过将构造函数视为一个特殊情况并将新的规则引入方法/成员绑定来实现这一点,这是否是一个好主意? 这在某些时候不可避免会导致混乱。

因为成员名称与类的构造函数名称冲突?

有一个正确的方法来做到这一点,是一个错误的做法。

为什么不C#允许它?

因为它没有理由这样做。 为什么你想在你的生活中造成这样的混乱。

我认为CLR允许它,因为另一个postcertificate了一个vb.net的例子,它不应该被限制,但我不希望创build一个基于CLR相同的规则的应用程序。抽象使代码更清晰。 我认为这个论点和多重inheritance是一样的。 是的,它可以用一些语言来完成,但是会造成混乱。 因此,我的答案是减less歧义和混淆,并以c#parsing器/编译器为基础。 C#团队的deviseselect。