为什么属性设置器和getter与get_X和set_X方法冲突?

Mot*_*tti 6 .net language-design properties

.NET属性中应该是一等公民,但在IL代码属性中,getter和setter实现为get_PropertyNameset_PropertyName.

class Property
{
    int Value { get { return 42; } }
    int get_Value() { return 6 * 9; }
    void set_Value(int i) { } // Error even though Value is a read only property
}
Run Code Online (Sandbox Code Playgroud)

输出:

错误CS0082:类型'SO.Property'已经保留了一个名为'get_Value'的成员,其成员具有相同的参数类型

错误CS0082:类型'SO.Property'已经保留了一个名为'set_Value'的成员,其成员参数类型相同

为什么设计师.NET决定使用可能与用户代码冲突的名称?他们本可以使用非法字符(因为Java $用于内部类).

Jb *_*ain 8

对于没有属性概念的语言,例如J#(可能很好地影响了设计决策),仍然需要一个简单的名称来调用它们.


Dav*_*itt 8

公共语言规范(CLS)需要实现属性的时候使用的IL的get_和set_方法(饰有特殊的位).这是必要的,以便不同的编译器(C#,托管C++,VB.NET,J#,IronPython等)创建可互操作的字节码.

因此,底线不能在更广泛意义上的"法律"的字符.它们不符合CLS,因此不应在非专用接口中使用.

另外,请参阅有关在MSDN上编写符合CLS的代码的文章.