5

次のようなプロパティで部分クラスを定義しました。

public partial class Item{    
    public string this[string key]
    {
        get
        {
            if (Fields == null) return null;
            if (!Fields.ContainsKey(key))
            {
                var prop = GetType().GetProperty(key);

                if (prop == null) return null;

                return prop.GetValue(this, null) as string;
            }

            object value = Fields[key];

            return value as string;
        }
        set
        {
            var property = GetType().GetProperty(key);
            if (property == null)
            {
                Fields[key] = value;
            }
            else
            {
                property.SetValue(this, value, null);
            }
        }
    }
}

私ができるように:

 myItem["key"];

Fieldsディクショナリのコンテンツを取得します。しかし、私がビルドすると、次のようになります。

「メンバー名を囲んでいるタイプと同じにすることはできません」

なんで?

4

1 に答える 1

12

インデクサーのデフォルト名は自動的にItem-になります。これは、含まれているクラスの名前です。CLRに関する限り、インデクサーはパラメーターを持つ単なるプロパティであり、包含クラスと同じ名前のプロパティ、メソッドなどを宣言することはできません。

1つのオプションは、クラスの名前を変更して、呼び出されないようにすることItemです。もう1つは、インデクサーに使用される「プロパティ」の名前をを介して変更すること[IndexerNameAttribute]です。

破損の短い例:

class Item
{
    public int this[int x] { get { return 0; } }
}

名前の変更により修正:

class Wibble
{
    public int this[int x] { get { return 0; } }
}

または属性別:

using System.Runtime.CompilerServices;

class Item
{
    [IndexerName("Bob")]
    public int this[int x] { get { return 0; } }
}
于 2012-12-12T20:47:56.477 に答える