Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/330.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 类型可以同时是引用类型和值类型吗?_C#_Type Systems - Fatal编程技术网

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) { }