【发布时间】:2011-10-11 10:22:57
【问题描述】:
我注意到 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# 是这样设计的?不允许显式声明一个参数的语言实现有什么不同?
【问题讨论】:
-
@CodeInChaos :感谢您的参考,但那里也没有真正的答案。 “可能简化类型推理规则”不是真正的原因。他们已经在 C++ 中做到了,为什么不在这里呢?
-
简化是一个非常真实的原因。与 C++ 相比,C# 经常选择更简单但不太通用的规则。
-
CodeInChaos:也许,但这是一个假设。找不到任何依据。
-
@Yochai,您为什么希望您的问题的答案与“语言实现的不同”有关?据推测,这不起作用的原因与 C# 中可能存在但不存在的每个看起来不错的功能相同。 Eric Lippert 写道:“我通常对
why is feature X not implemented?的回应是,在有人设计、实施、测试、记录和发布该功能之前,所有功能当然都是未实现的,而且还没有人花钱这样做。”跨度>
标签: c# .net templates generics