语言设计-为什么C#成员名称不能与封闭类型名称相同?

在C#中,以下代码无法编译:

class Foo {

    public string Foo;

}

问题是:为什么?

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

成员名称不能与它们的封闭类型相同

好的。 我知道,我保证不会再做。

但是我真的不明白为什么编译器拒绝接受任何与封闭类型同名的字段。 阻止我这样做的潜在问题是什么?

Vivien Barousse asked 2020-01-14T15:34:16Z
4个解决方案
50 votes

严格来说,这是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();
Dan Bryant answered 2020-01-14T15:34:44Z
19 votes

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

因此,如果您的代码被允许-您将如何称呼构造函数?

即使可以通过将构造函数视为特例并在方法/成员绑定中引入新规则来做到这一点,这是一个好主意吗? 在某些时候不可避免地会导致混乱。

James Gaunt answered 2020-01-14T15:35:14Z
2 votes

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

winwaed answered 2020-01-14T15:35:34Z
0 votes

有正确的方法来做,而有错误的方法来做。

为什么C#不允许?

因为它没有理由这样做。 您为什么要在生活中造成这种困惑。

我认为CLR允许这样做,正如另一篇vb.net示例所证明的那样,它不应该受到限制,但我不想基于CLR所使用的相同规则创建应用程序。抽象使代码更清晰 。 我认为该论点与多重继承在同一个层次上起作用。 是的,可以用某些语言来完成,但是会引起混乱。 因此,我的答案是减少歧义和混乱,它基于c#解析器/编译器。 C#团队的设计选择。

WeNeedAnswers answered 2020-01-14T15:36:08Z
translate from https://stackoverflow.com:/questions/4074055/why-cant-c-sharp-member-names-be-the-same-as-the-enclosing-type-name