成员名称不能与具有部分类的封闭类型相同

时间:2012-12-12 20:45:53

标签: c# partial-classes

我已经使用如下属性定义了一个部分类:

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字典的内容。但是,当我建立我得到:

  

"成员名称不能与其封闭类型相同"

为什么?

1 个答案:

答案 0 :(得分:12)

索引器自动具有默认名称Item - 这是包含类的名称。就CLR而言,索引器只是一个带参数的属性,你不能声明一个与包含类同名的属性,方法等。

一种选择是重命名您的课程,使其不被称为Item。另一种方法是通过[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; } }
}