2011-07-15 43 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

当你定义索引是这样的:

this[string propertyName] 

它编译成.Item财产。

您可以使用[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的界面,你会本身

.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#不隐藏背后的一些特殊的方法名这种语法与您CLR使用的实际方法名称相冲突。

相关问题