2011-07-15 9 views
1

可能性の重複を宣言されています
Class with indexer and property named “Item”項目と、この[] - 同じ名前のメンバーが既に

はちょうど私が前に見ていませんでした何かに出くわし、なぜこのことを思っていました起こっているかもしれませんか?

次のクラスでは、 "Item"と "this [...]"に関して "同じ名前のメンバーが既に宣言されています"というコンパイラエラーが発生します。

public class SomeClass : IDataErrorInfo 
{ 
    public int Item { get; set; } 

    public string this[string propertyName] 
    { 
     get 
     { 
      if (propertyName == "Item" && Item <= 0) 
      { 
       return "Item must be greater than 0"; 
      } 
      return null; 
     } 
    } 

    public string Error 
    { 
     get { return null; } 
    } 
} 

コンパイラは、[...]とItemが同じメンバ名を使用していると思われるようです。これは正解/正常ですか?私はこれまでに遭遇していないことに驚いています。

+0

これは複製です。このSOの質問への答えを参照してください:http://stackoverflow.com/questions/5110403/class-with-indexer-and-property-named-item。 –

答えて

7

あなたはこのようにインデクサを定義する場合:それは.Itemプロパティにコンパイルされ

this[string propertyName] 

[System.Runtime.CompilerServices.IndexerName("NEW NAME FOR YOUR PROPERTY")]属性で修正することができます。

6

イエップ。 this[]は、デフォルトでというItemというプロパティにコンパイルされます。 System.Runtime.CompilerServices.IndexerName属性を使用して変更することができます。 (MSDN link

2

これは正常です。 C#言語にはインデクサーを宣言するために使用されるキーワード "this"がありますが、コンパイルされたクラスでは、インデクサーのgetメソッドはget_Item(.NETでのクロス言語の規約)と呼ばれます。コンパイラはItemプロパティのゲッターに同じ名前を付けたいので、エラーを報告します。

0

あなたはILコードでIDataErrorInfoインターフェイスを見ればあなたがSE

public interface IDataErrorInfo 
{ 
    // Properties 
    string Error { get; } 
    string this[string columnName] { get; } 
} 

にC#で翻訳しない

.class public interface abstract auto ansi IDataErrorInfo 
{ 
    .custom instance void [mscorlib]System.Reflection.DefaultMemberAttribute::.ctor(string) = { string('Item') } 
    .property instance string Error 
    { 
     .get instance string System.ComponentModel.IDataErrorInfo::get_Error() 
    } 

    .property instance string Item 
    { 
     .get instance string System.ComponentModel.IDataErrorInfo::get_Item(string) 
    } 

} 

だから、理由はC#が背後にいくつかの特別なメソッド名を隠していているでしょうこの構文はCLRで使用される実際のメソッド名と衝突します。

関連する問題