6

如果不是,并且引用类型和值类型的集合是互斥的,为什么不编译:

public static void Do<T>(T obj) where T : struct { }
public static void Do<T>(T obj) where T : class { }

编译器声明:“类型已经定义了一个名为 'Do' 的成员,具有相同的参数类型。”,但这里的 T 和 T 并不相同。一种是受结构约束,另一种是受类约束。对函数的调用应该始终是可解析的。有反例吗?

4

2 回答 2

3

通用约束不被视为重载匹配的一部分。它与返回类型相同。

例如,这将导致相同的错误(重载仅在返回类型上有所不同):

public static int Do<T>(T obj) { }
public static bool Do<T>(T obj) { }

在这两种情况下,匹配重载的规则只考虑参数类型,而忽略约束和返回类型等附加信息。

于 2010-10-23T08:50:55.993 回答
1

不,类型永远不能两者兼而有之。代码失败是因为泛型参数(<T>即,不是T obj)没有“重载”概念。也没有任何类似于 C++ 模板专业化的东西。

于 2010-10-23T08:51:49.200 回答