C# 类型可以同时是引用类型和值类型吗?
如果不是,并且引用类型和值类型集是互斥的,那么为什么不编译:C# 类型可以同时是引用类型和值类型吗?,c#,type-systems,C#,Type Systems,如果不是,并且引用类型和值类型集是互斥的,那么为什么不编译: public static void Do<T>(T obj) where T : struct { } public static void Do<T>(T obj) where T : class { } publicstaticvoiddo(tobj)其中T:struct{} 公共静态void Do(T obj),其中T:class{} 编译器声明:“Type已经用相同的参数类型定义了一个名为‘Do’
public static void Do<T>(T obj) where T : struct { }
public static void Do<T>(T obj) where T : class { }
publicstaticvoiddo(tobj)其中T:struct{}
公共静态void Do(T obj),其中T:class{}
编译器声明:“Type已经用相同的参数类型定义了一个名为‘Do’的成员。”,但是T和T在这里不一样。一个是对结构的约束,另一个是对类的约束。对函数的调用应始终是可解析的。是否有反例?通用约束不作为重载匹配的一部分。它与返回类型相同 例如,这将导致相同的错误(重载仅在返回类型上不同):
publicstaticintdo(tobj){
公共静态booldo(tobj){}
在这两种情况下,匹配重载的规则只考虑参数类型,而忽略其他信息,如约束和返回类型。否,类型不能同时为这两种类型。代码失败是因为通用参数(即,不是
T obj
)没有“重载”概念。C++也没有类似于C++模板的任何东西。实际上,一个被约束为“引用类型”(包括引用、接口等)而不仅仅是类,而另一个则被约束为结构,除了在代码>可空的中涉及的50%个(可能的)结构。例如,这些约束目前不允许t===int?
。尽管您可以在装箱的值类型上打结;)
public static int Do<T>(T obj) { }
public static bool Do<T>(T obj) { }