2

重複の可能性:
「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; }
    }
}

コンパイラは、this[...]とItemが同じメンバー名を使用していると考えているようです。これは正しい/正常ですか?私はこれまでこれに出くわしたことがないことに驚いています。

4

4 に答える 4

8

次のようにインデクサーを定義すると:

this[string propertyName]

プロパティにコンパイルされ.Itemます。

[System.Runtime.CompilerServices.IndexerName("NEW NAME FOR YOUR PROPERTY")]インデクサーへの属性でそれを修正できます。

于 2011-07-15T21:10:31.753 に答える
6

うん。デフォルトでthis[]呼び出されるプロパティにコンパイルされます。属性を使用してこれを変更できます。(MSDNリンクItem System.Runtime.CompilerServices.IndexerName

于 2011-07-15T21:07:43.013 に答える
2

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

于 2011-07-15T21:10:04.550 に答える
0

IL コードを含む IDataErrorInfo インターフェイスを見ると、

.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# で次のように変換されます

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

その理由は、C# が this 構文の背後に特別なメソッド名を隠しているためです。これは、CLR で使用される実際のメソッド名と衝突します。

于 2011-07-15T21:11:17.477 に答える