2012-08-01 7 views
5

Ist es möglich, eine generische Integritätsregel zu haben, die ein unbegrenzter generischer Typ ist?C# unbeschränkter generischer Typ als Einschränkung

Zum Beispiel:

public T DoSomething<T>(T dictionary) where T : IDictionary<,> 
{ 
    ... 
} 

Edit: einfach den Zusammenhang zu erklären, ich habe die Verwendung des Verfahrens auf einen IDictionary, aber für das Verfahren beschränken will sich ihm genau spielt keine Rolle, was TKey und TValue sind.

+4

'public V DoSomething (IDictionary Wörterbuch)' Ist das, was du meintest? – oleksii

+1

Amir Abiri, warum soll der Rückgabetyp dem Parametertyp "T" entsprechen? Wirst du den Parameter zurückgeben? Das ist wahrscheinlich nicht nötig. Und Sie können nicht einfach ein anderes 'T' konstruieren. Es sei denn, Sie möchten auch "T: new()" einschränken. –

Antwort

6

ist dies nicht möglich, müssen Sie die Typparameter angeben:

public T DoSomething<T, TKey, TValue>(T dictionary) where T : IDictionary<TKey, TValue> { ... } 
+1

Sie sehen die lustige Sache ist, dass TKey und TValue aus T abgeleitet werden können und ich brauche sie nirgendwo im Körper der Methode. Also hatte ich gehofft, die generische Signatur sauberer zu machen. –

+0

@AmirAbiri - Könnten Sie statt dessen 'T' auf das nicht-generische' IDictionary' beschränken? – Lee

+0

Nun, eigentlich habe ich nur IDictionary verwendet, um das Beispiel zu vereinfachen. Mein realer Typ ist "jede Unterklasse von BaseGameState " (d. H. T ist keine Schnittstelle, es ist meine eigene Basisklasse). –

0

Nein, Sie kann das nicht tun. Vielleicht können Sie in rosylin github jedoch

public IDictionary<TKey, TValue> DoSomething<TKey, TValue>(IDictionary<TKey, TValue> dictionary) 
{ 
... 
} 
1

Es gibt ein Problem verwenden, ist es noch nicht getan. Das ist momentan nicht möglich, aber ich erwarte, dass es relativ bald sein wird.