类型可以同时是引用类型和值类型吗?

时间:2010-10-23 08:48:37

标签: c# type-systems

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

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

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

2 个答案:

答案 0 :(得分:3)

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

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

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

在这两种情况下,匹配重载的规则仅考虑参数类型,忽略其他信息,如约束和返回类型。

答案 1 :(得分:1)

不,类型永远不会同时存在。代码失败,因为泛型参数(<T>,即不是T obj)没有“重载”概念。也没有类似C ++模板专业化的东西。