Я заметил, что компилятор С# не выводит второй общий параметр.
Пример:
Код шаблона С++: (да, я знаю, что шаблоны не работают как generics)
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
Шаблоны (и generics) не могут вывести тип возвращаемого значения, поэтому в С++ я даю ему первый параметр шаблона, а второй параметр шаблона выводится из типа переменной.
Теперь, тот же пример в С#:
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.
Итак, почему не может использовать С# generics, выводящий второй тип (в то время как в шаблонах С++ это явно может)?
Я уверен, что он был разработан таким образом (я сомневаюсь, что команда .Net упустила это из виду), поэтому почему он сконструирован таким образом, что я должен явно указать оба типа?
Edit:
Из обсуждений, которые мы имели в ответах до сих пор, оба языка поддерживают перегрузку по числу параметров шаблона.
Так снова, почему создан С# таким образом? Чем отличается реализация языка, которая не позволяет явно объявить только один параметр?