2009-05-20 15 views
5

.NETのプロパティしかしながらILコードプロパティゲッターで第一級オブジェクトことになっているとセッターはget_PropertyName意味set_PropertyName意味として実装されています。プロパティセッターとゲッターがget_Xメソッドとset_Xメソッドで衝突するのはなぜですか?

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 
} 

出力:

エラーCS0082:SOタイプ」:タイプ 'SO.Property' は既に同じパラメータ型

エラーCS0082で 'GET_VALUE' と呼ばれるメンバーを留保します。プロパティ 'はすでに同じパラメータタイプの' set_Value 'というメンバを予約しています

なぜ.NETのignersは、ユーザーコードと衝突するかもしれない名前を使用することにしましたか?彼らは不正な文字を使用する可能性があります(Javaは内部クラスのものに$を使用するため)。

+6

get_Value()およびset_Value()の形式は、C#命名規則(http://msdn.microsoft.com/en-us/library/ms229045.aspx)にも適用されます。「アンダースコア、ハイフン、またはその他の英数字以外の文字を使用してください。 これはまさにこの問題が原因かもしれませんが、C#コードでこの形式を使用しないでください。 – alastairs

答えて

8

は、それはそれらを呼び出すための単純な名前を持ってすることが必要です。

1

いい質問 - コンパイラが生成したメンバー(匿名型およびメソッド)のほとんどは、あなたのクラスのすべてのメンバーと衝突しないように保証されている名前を使用します。私は、この特定のインスタンス(およびイベントメソッドの生成された名前)は、マイクロソフトが少し間違いを犯したケースだと思います。決定を正当化するだろう、私はそれを考えることができ

唯一の理由は、Microsoftが他の言語自体は「財産」のコンセプトや構文を持っていないこれらのメソッドを呼び出すことができるように待っているかもしれないということです。

+1

それほど間違いではなく、それは慎重だった。これにより、プロパティの概念をサポートしていない言語が呼び出すことが容易になり、リフレクションによってgettorまたはsettorを簡単に取得できるようになります。 – Abel

2

彼らは外部コードから呼び出すことが必要になることがありますので。 (非常によく、その設計上の意思決定に影響を与えたかもしれない)、このようなJ#などの特性の概念を持っていない言語では

+0

CLRの外部? – Motti

+1

いいえ、C#の "外部" - Jb Evainsの回答を参照してください。 –

7

Common Language Specification(CLS)は(特別なビットで飾ら)ILにget_メソッドとSET_方法の使用プロパティを実装する必要があります。これは、異なるコンパイラ(C#、マネージC++、VB.NET、J#、IronPythonなど)が相互運用可能なバイトコードを作成するために必要です。

したがって、アンダースコアは、広義には「法的な」文字ではないです。 CLS準拠ではないため、非プライベートインターフェイスでは使用しないでください。

また、MSDNのwriting CLS-compliant codeについてのこの記事を参照してください。

関連する問題