Я хотел записать дополнительный метод, который будет работать над словарями, значения которых были своего рода последовательностью. К сожалению, компилятор, может казаться, не выводит универсальные аргументы от моего использования метода; я должен указать их явно.
public static void SomeMethod<TKey, TUnderlyingValue, TValue>
(this IDictionary<TKey, TValue> dict)
where TValue : IEnumerable<TUnderlyingValue> { }
static void Usage()
{
var dict = new Dictionary<int, string[]>();
var dict2 = new Dictionary<int, IEnumerable<string>>();
//These don't compile
dict.SomeMethod();
SomeMethod(dict); // doesn't have anything to do with extension-methods
dict2.SomeMethod(); // hoped this would be easier to infer but no joy
//These work fine
dict.SomeMethod<int, string, string[]>();
dict2.SomeMethod<int, string, IEnumerable<string>>();
}
Я понимаю, что вывод типа не является точной наукой, но я задавался вопросом, существует ли некоторое фундаментальное 'правило', я отсутствую здесь - я не знаком с деталями спецификации.