Дженерики: Почему компилятор не может вывести аргументы типа в этом случае?

Я хотел записать дополнительный метод, который будет работать над словарями, значения которых были своего рода последовательностью. К сожалению, компилятор, может казаться, не выводит универсальные аргументы от моего использования метода; я должен указать их явно.

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>>();
}

Я понимаю, что вывод типа не является точной наукой, но я задавался вопросом, существует ли некоторое фундаментальное 'правило', я отсутствую здесь - я не знаком с деталями спецификации.

  1. Действительно ли это - недостаток процесса вывода или является моим ожиданием, что компилятор должен "понять это" неблагоразумный в этом случае (неоднозначность, возможно)?
  2. Я могу изменить подпись метода способом, которая сделала бы это одинаково функциональным уже 'inferrable'?
8
задан Ani 19 October 2010 в 13:33
поделиться