2010-12-01 11 views
1

Ich habe eine generische Klasse vonWie passende Art in der generischen Klasse

public class Mapper<K, L, V> : Dictionary<K, V> 

indentify Wenn ich es als

Mapper<string, string, MapSource> Map= new Mapper<string, string, MapSource>(); 

instanziiert und versuchen und tun

Map["..."]. 

ist kommt zurück mit Compiler Fehlermeldung von

Der Aufruf ist zwischen den folgenden Methoden oder Eigenschaften nicht eindeutig: 'MinorTesting.XML.Sourcer.Mapper.this [L]' und 'MinorTesting.XML.Sourcer.Mapper.this [K]'

Wie würde ich das beheben? um das Kompilieren zu entfernen.

Bob.

+3

FYI es eine schlechte Programmierpraxis ist vereinen einen generischen Typ, so dass unter angemessenen Konstruktionen gibt es Signaturen, die zu erklären.Es gibt Situationen, in denen dies zu implementierungsdefiniertem Verhalten in der CLR führt. Vermeiden, vermeiden, vermeiden. Konstruieren Sie Ihren Typ niemals so, dass eine Signatur vereinheitlicht wird, oder, falls es beabsichtigt ist, eine -Map zu haben, dann gestalten Sie die öffentliche Oberfläche der Klasse so, dass Methoden, die vereinheitlichen würden, unterschiedliche Namen haben. –

+0

Danke Eric, ich habe es schließlich aufgegeben. Eine einfachere Lösung bot sich an. –

Antwort

4

Wie sieht MultiKeyDictionary aus und wo/wie wird es verwendet?

Es sieht aus wie MultiKeyDictionary bietet zwei Indexer, this[L] und this[K]. Wenn L und K identisch sind, kann der Compiler nicht zwischen diesen Indexern wählen, da beide effektiv zu this[string] geworden sind.

Eine Option wäre, explizite Methoden zur Verfügung zu stellen, die in diesem Fall anstelle des Indexers verwendet werden: zum Beispiel GetByKey(K) und GetByValue(L) oder ähnlich.

+0

Es ist ein Multidictionary, von dem ich nicht wirklich wusste. Danke für die schnelle Antwort. –

5

So sieht Ihre Klasse wie folgt:

public class MultiKeyDictionary<K, L, V> 
{ 
    public V this[K key] 
    { 
     get { return... } 
    } 

    public V this[L key] 
    { 
     get { return... } 
    } 
} 

Also, wenn beide K und Lstring in Ihrem konstruierten Typ sind, im Wesentlichen Sie haben diese:

public class MultiKeyDictionary 
{ 
    public V this[string key] 
    { 
     get { return... } 
    } 

    public V this[string key] 
    { 
     get { return... } 
    } 
} 

Offensichtlich wird dies nicht funktionieren. Das Problem ist mit dem spezifischen Generika hier nähern - Sie sicher zwei Tasten des gleichen Typs durch Ersetzen der Item-Eigenschaften mit so etwas wie unterstützen könnten:

public V GetByK(K key) 
{ 
    ... 
} 

public V GetByL(L key) 
{ 
    ... 
} 
+0

Ausgezeichnete Arbeit Kumpel. Es implementiert zwei Indexer wie oben. –

0

Ihre Klasse erbt von Dictionary<K, V>, die implizit definiert die this[K] Accessor in deine Klasse. Wenn Sie den this[L] Accessor explizit definieren und K und V übereinstimmen, erhalten Sie den Konflikt.

Sie sollten meiner Meinung nach nicht von Dictionary erben. Möglicherweise möchten Sie ein Wörterbuch für den internen Gebrauch einkapseln.

0

Kann einfach so sein.

public class Mapper<K, L, V> : Dictionary<K, V> 
{ 
    public V this[K key1, L Key2] 
    { 
     get { return (key1 != null) ? dic[key1] : dic[Key2]; } 
    } 

} 

Um dies zu

Mapper<string, string, int> a = new Mapper<string, string, int>(); 
var s = a[null, "sam"]; 
Zugang
Verwandte Themen