Компилятор может определить один из параметров универсального типа, используя тип 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 # разработан таким образом? Чем отличается языковая реализация от явного объявления только одного параметра?