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

Viv*_*sse 52 c# language-design

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

class Foo {

    public string Foo;

}
Run Code Online (Sandbox Code Playgroud)

问题是:为什么?

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

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

好的.我明白,我保证,我不会再这样做了.

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

Dan*_*ant 50

严格来说,这是C#强加的限制,最有可能是为了方便语法.构造函数有一个方法体,但它在IL中的成员条目表示为".ctor",它的元数据与普通方法略有不同(在Reflection类中,ConstructorInfo派生自MethodBase,而不是MethodInfo.)我不相信有一个.NET限制,阻止创建一个与外部类型同名的成员(甚至一个方法),虽然我还没有尝试过.


我很好奇,所以我确认它不是.NET的限制.在VB中创建以下类:

Public Class Class1
    Public Sub Class1()

    End Sub
End Class
Run Code Online (Sandbox Code Playgroud)

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

var class1 = new Class1();
class1.Class1();
Run Code Online (Sandbox Code Playgroud)

  • 这可能是这里最好、最完整的答案。在 VB 中(我想我只是在嘴里吐了一点) ctor 是 Sub New () ... (2认同)

Jam*_*unt 19

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

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

即使可以通过将构造函数视为特殊情况并将新规则引入方法/成员绑定来实现这一点 - 这是一个好主意吗?在某些方面它将不可避免地导致混乱.

  • 构造函数是一种方法.为什么你认为不是?例如,您可以从派生对象中的构造函数调用它. (9认同)
  • 在生成的CIL中,构造函数不保留类型名称.它被称为`.ctor()`.因此,一旦编译,它们绝对不是`Foo`(属性)和构造函数(`.ctor`)之间的冲突. (9认同)
  • "构造函数是在创建给定类型的对象时执行的类方法." http://msdn.microsoft.com/en-us/library/ms173115.aspx (6认同)
  • 但构造函数不是方法或任何东西,它不应该干扰代码的其余部分. (5认同)
  • 我不认为构造函数的名称与类的名称相同.这只是用于声明构造函数的C#语法.真正的名字就像`.ctor`.一个有趣的问题是,这个命名限制只是C#语言限制还是.net类型系统的真正限制. (5认同)