Компилятор может определить один из параметров универсального типа, используя тип someBoz, даже если ему необходимо явно указать параметры FooType и BarType.

от вопрос уже есть ответ здесь:

Почему я должен предоставлять явно общие типы параметров, в то время как компилятор должен выводить тип? 3 ответа

Я заметил, что компилятор C # не выводит второй универсальный параметр.
Пример:

Код шаблона C ++: (да, я знаю, что шаблоны не работают как дженерики)

class Test {
public:
template <class T,class V> 
    T test(V v) {
       //do something with v
       return T();
    }
};

int i = 0;
Test t = new Test();
double j = t.test<double>(i); //infers V as int

Шаблоны (и обобщения) не могут определить тип возвращаемого значения, поэтому в C ++ я даю ему первый параметр шаблона, а второй параметр шаблона выводится из типа переменной.

Теперь тот же пример в C #:

class Test {
    public T test<T,V>(V v) where T: new() {
       //do something with v
       return new T();
    }
};

int i = 0;
Test t = new Test();
double j = t.test<double>(i); //Error Using the generic method 'Test.test<T,V>(V)' requires '2' type arguments

Но если я использую 1 тип, мне не нужно явно указывать тип:

class Test {
    public V test<V>(V v) where V: new() {
       return new V();
    }
};

int i = 0;
Test t = new Test();
int j = t.test(i); //OK infers V as int.

Так,Почему не могут ли дженерики C # выводить второй тип (в то время как в шаблонах c ++ это явно может)?
Я уверен, что это разработано таким образом (я сомневаюсь, что команда .Net упустила это из виду), поэтомуПочему это разработано таким образом, что я должен явно указать оба типа?

Редактировать:

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

Итак, еще раз,Почему C # разработан таким образом? Чем отличается языковая реализация от явного объявления только одного параметра?

Ответы на вопрос(3)

Ваш ответ на вопрос