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 回答