【发布时间】:2020-05-24 03:42:49
【问题描述】:
C# 中是否有任何不是类的引用类型?以下泛型中的约束是否包括所有引用类型?
static void f<T>() where T : class
{
T t = default;
Console.WriteLine(t);
}
【问题讨论】:
C# 中是否有任何不是类的引用类型?以下泛型中的约束是否包括所有引用类型?
static void f<T>() where T : class
{
T t = default;
Console.WriteLine(t);
}
【问题讨论】:
你问了两个不同的问题
C#中的所有引用类型都是类类型吗?
没有
是否在以下泛型 [
where T : class] 中进行约束,包括所有参考 类型?
是的,它将限制所有引用类型
首先,让我们确定引用类型实际上是什么。
Reference types (C# Reference)
C#中有两种类型:引用类型和值类型。 引用类型的变量存储对其数据(对象)的引用, 而值类型的变量则直接包含它们的数据。
以下关键字用于声明引用类型:
类
界面
委托
C# 还提供以下内置引用类型:
动态
对象
字符串
注意:上面没有提到,Array类型也是从abstract基类型Array派生的引用类型
其次,让我们弄清楚类约束限制了什么
Constraints on type parameters (C# Programming Guide)
where T : class类型参数必须是引用类型。此约束适用 也适用于任何类、接口、委托或数组类型。
注意:上面没有提到,class 约束还包括dynamic
另外,从 C# 7.3 开始,您还可以通过 delegate 显式约束
委托约束
同样以 C# 7.3 开头,您可以使用
System.Delegate或System.MulticastDelegate作为基类约束。 CLR 总是 允许这个约束,但 C# 语言不允许它
【讨论】: