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

时间:2009-05-20 10:46:35

标签: .net properties language-design

.NET属性中应该是一等公民,但在IL代码属性中,getter和setter实现为get_ PropertyName 和{{1 }} 的PropertyName

set_

输出:

  

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

     

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

为什么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 } 的设计师决定使用可能与用户代码冲突的名称?他们可能使用了非法字符(因为Java使用.NET作为内部类的东西)。

4 个答案:

答案 0 :(得分:8)

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

答案 1 :(得分:7)

Common Language Specification(CLS)在实现Properties时需要在IL中使用get_和set_方法(用特殊位修饰)。这是必要的,以便不同的编译器(C#,托管C ++,VB.NET,J#,IronPython等)创建可互操作的字节码。

从广义上讲,强调 不是“合法”字符。它们不符合CLS,因此不应在非私有接口中使用。

另外,请参阅有关MSDN上的writing CLS-compliant code的这篇文章。

答案 2 :(得分:2)

因为可能需要从外部代码调用它们。

答案 3 :(得分:1)

好问题 - 大多数编译器生成的成员(匿名类型和方法)使用的名称保证不会与类中的任何成员冲突。我认为这个特定的实例(以及事件方法生成的名称)是微软犯了一点错误的情况。

我能想到的唯一理由是,微软可能一直希望允许其他语言调用这些本身没有“属性”概念或语法的方法。