在C#中,以下代码无法编译:
class Foo {
public string Foo;
}
问题是:为什么?
更确切地说,我明白这不会编译,因为(我引用):
成员名称不能与其封闭类型
相同
好的,好的。我明白,我保证不再这样做了。
但我真的不明白为什么编译器拒绝接受任何与封闭类型同名的字段。阻止我这样做的根本问题是什么?
答案 0 :(得分:48)
严格地说,这是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();
答案 1 :(得分:19)
因为Foo被保留为构造函数的名称。
因此,如果您的代码被允许 - 您会将其称为构造函数吗?
即使可以通过将构造函数视为特殊情况并将新规则引入方法/成员绑定来实现这一点 - 这是一个好主意吗?它会在某些时候不可避免地导致混淆。
答案 2 :(得分:2)
因为成员名称与类的构造函数名称冲突?
答案 3 :(得分:0)
有一种正确的方法可以做到这一点并采用错误的方法。
为什么C#不允许它?
因为没有理由这样做。你为什么要在生活中制造这样的混乱。
我认为CLR允许它,因为另一篇文章证明了vb.net示例并且它不应该受到限制,但我不想基于CLR操作的相同规则创建应用程序。抽象使得代码更清晰。我认为该论证与多重继承的工作水平相同。是的,它可以用某些语言完成,但会引起混淆。因此,我的答案是减少歧义和混淆,并且基于c#解析器/编译器。 C#团队的设计选择。