2012-12-12 11 views
5

Ho definito una classe parziale con una proprietà come questa:nomi dei membri non può essere lo stesso di loro tipo di cinta con classe parziale

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); 
      } 
     } 
    } 
} 

in modo che io possa fare:

myItem["key"]; 

e ottenere il contenuto del dizionario Fields. Ma quando costruisco io ottenere:

"nomi dei membri non può essere lo stesso come il loro tipo contenitore"

Perché?

risposta

12

Gli indicizzatori hanno automaticamente un nome predefinito di Item - che è il nome della classe contenente. Per quanto riguarda il CLR, un indicizzatore è solo una proprietà con parametri e non è possibile dichiarare una proprietà, un metodo ecc con lo stesso nome della classe contenente.

Un'opzione è quella di rinominare la classe in modo che non venga chiamata Item. Un altro sarebbe cambiare il nome della "proprietà" usata per l'indicizzatore, tramite [IndexerNameAttribute].

Shorter esempio di brokenness:

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

fisso dal cambiamento del nome:

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

Attributi:

using System.Runtime.CompilerServices; 

class Item 
{ 
    [IndexerName("Bob")] 
    public int this[int x] { get { return 0; } } 
} 
+0

Questo spiegava esso. Grazie! Dapprenderò prima l'attributo. – espvar

+0

Così confuso anche su questo, grazie! – Patrick