2011-07-15 69 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使用的實際方法名稱相沖突。

相關問題