C# 中的所有引用类型都是类类型吗?

use*_*077 3 c# types reference class

C# 中是否有任何不是类的引用类型?以下泛型中的约束是否包括所有引用类型?

static void f<T>() where T : class
{
    T t = default;
    Console.WriteLine(t);
}
Run Code Online (Sandbox Code Playgroud)

AAA*_*ddd 6

你在问两个不同的问题

C# 中的所有引用类型都是类类型吗?

以下泛型 [ where T : class]中的约束是否包括所有引用类型?

是的,它将限制所有引用类型


首先,让我们确定引用类型实际上是什么。

引用类型(C# 参考)

C#中有两种类型:引用类型值类型。引用类型的变量存储对其数据(对象)的引用,而值类型的变量直接包含其数据。

以下关键字用于声明引用类型:

  • 班级

  • 界面

  • 代表

C# 还提供了以下内置引用类型:

  • 动态的

  • 目的

  • 细绳

注意:上面没有提到,Array类型也是从abstract基类型派生的引用类型Array

其次,让我们弄清楚类约束约束了什么

类型参数的约束(C# 编程指南)

where T : class

类型参数必须是引用类型。此约束也适用于任何接口委托数组类型

注意:上面没有提到,class约束还包括dynamic


作为一个额外的事实,从C# 7.3 开始,您还可以通过委托显式约束

委托约束

同样从C# 7.3开始,您可以使用System.DelegateSystem.MulticastDelegate作为基类约束。CLR 始终允许此约束,但 C# 语言不允许它