2012-08-01 26 views
5

Czy jest możliwe ogólne ograniczenie, które jest nieograniczonym typem generycznym?C# nieograniczony rodzajowy typ jako ograniczenie

Na przykład:

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

Edit: Wystarczy, aby wyjaśnić kontekst, chcę, aby ograniczyć wykorzystanie tej metody do IDictionary, ale dla samej metody nie ma znaczenia, dokładnie czym jest TKey i TValue.

+4

'public V DoSomething (IDictionary słownik)' Czy to masz na myśli? – oleksii

+1

Amir Abiri, dlaczego chcesz, aby typ powrotu był taki sam jak typ parametru "T"? Czy zwrócisz parametr? Prawdopodobnie nie ma takiej potrzeby. I nie można łatwo skonstruować kolejnego 'T'. Chyba, że ​​chcesz ograniczyć także 'T: new()'. –

Odpowiedz

6

Nie jest to możliwe, należy określić parametry typu:

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

Widzisz zabawne, że TKey i TValue można wywnioskować z T i nie potrzebuję ich nigdzie w ciele metody. Miałem więc nadzieję, że ogólny podpis stanie się czystszy. –

+0

@AmirAbiri - Czy możesz zamiast tego ograniczyć 'T' do nietypowego' IDictionary'? – Lee

+0

Tak naprawdę użyłem IDictionary tylko w celu uproszczenia przykładu. Moim prawdziwym typem jest "dowolna podklasa BaseGameState " (tzn. T nie jest interfejsem, to moja własna klasa bazowa). –

0

Nie, nie mogę tego zrobić. Być może można użyć

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

Występuje problem w rosylin github, jednak to nie jest jeszcze zrobione. W tej chwili nie jest to możliwe, ale spodziewam się, że wkrótce to nastąpi.