С# неограниченный общий тип как ограничение

Возможно ли иметь универсальное ограничение, которое является неограниченным универсальным типом?

Например:

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

Редактировать: Просто чтобы объяснить контекст, я хочу ограничить использование метода IDictionary, но для самого метода не имеет значения, что такое TKey и TValue.


person Amir Abiri    schedule 01.08.2012    source источник
comment
public V DoSomething<K,V>(IDictionary<K,V> dictionary) Вы это имели в виду?   -  person oleksii    schedule 01.08.2012
comment
Амир Абири, почему вы хотите, чтобы тип возвращаемого значения был таким же, как тип параметра T? Вы собираетесь вернуть параметр? Наверное, в этом нет необходимости. И вы не можете легко построить еще один T. Если только вы не хотите также ограничивать T : new().   -  person Jeppe Stig Nielsen    schedule 01.08.2012


Ответы (3)


Это невозможно, вам нужно указать параметры типа:

public T DoSomething<T, TKey, TValue>(T dictionary) where T : IDictionary<TKey, TValue> { ... }
person Lee    schedule 01.08.2012
comment
Видите ли, забавно то, что TKey и TValue могут быть выведены из T, и мне они не нужны нигде в теле метода. Поэтому я надеялся сделать общую подпись более чистой. - person Amir Abiri; 01.08.2012
comment
@AmirAbiri - Не могли бы вы вместо этого ограничить T неуниверсальным IDictionary? - person Lee; 01.08.2012
comment
На самом деле я использовал IDictionary только для упрощения примера. Мой реальный тип — это любой подкласс BaseGameState‹?› (т. е. T — это не интерфейс, это мой собственный базовый класс). - person Amir Abiri; 01.08.2012

В rosylin github есть проблема, однако она еще не решена. Так что это невозможно прямо сейчас, но я ожидаю, что это будет относительно скоро.

person Alex Zhukovskiy    schedule 06.01.2017

Нет, ты не можешь этого сделать. Может быть, вы можете использовать

public IDictionary<TKey, TValue> DoSomething<TKey, TValue>(IDictionary<TKey, TValue> dictionary)
{
...
}
person Jeppe Stig Nielsen    schedule 01.08.2012