gpt4 book ai didi

c# - 其中 t : class generic constraint and const value declaration

转载 作者:太空狗 更新时间:2023-10-29 23:51:34 25 4
gpt4 key购买 nike

根据 10.4 Constants 中的 C# 规范:

The type specified in a constant declaration must be sbyte, byte, short, ushort, int, uint, long, ulong, char, float, double, decimal, bool, string, an enum-type, or a reference-type. Each constant-expression must yield a value of the target type or of a type that can be converted to the target type by an implicit conversion (§6.1).

为什么我不能执行以下操作:

public class GenericClass<T>
where T : class
{
public const T val = null;
}

这应该是可能的,因为:

  • 其中 T : class 表示 类型参数必须是引用类型;这也适用于任何类、接口(interface)、委托(delegate)或数组类型(来自 MSDN )
  • 它满足规范中的另一个词:string 以外的引用类型常量的唯一可能值为 null

有什么可能的解释吗?

最佳答案

可能的解释

考虑 CLR 如何初始化 static泛型类的成员或当它调用泛型类型的静态构造函数时。通常,静态初始化发生在程序首次加载时;但是,泛型类会在第一次创建该类的实例时初始化它们的静态成员。

请记住,泛型类不是单一类型;每一个T在类型声明中传递的是创建一个新类型。

现在考虑一个const表达式,要求在编译时求值。虽然 T 被限制为一个类,因此它可以接收值 null,变量 val在运行时创建类之前不存在于内存中。

例如,考虑如果 const T val有效。然后我们可以在代码的其他地方使用:

GenericClass<string>.val
GenericClass<object>.val

编辑

尽管两个表达式的值都是 null , 前者的类型是 string后者的类型是 object .为了让编译器执行替换,它需要知道相关常量的类型定义。

约束可以在编译时强制执行,但开放泛型直到运行时才会转换为封闭泛型。因此,GenericClass<object>.val无法存储在编译器的本地内存中以执行替换,因为编译器不会实例化泛型类的封闭形式,因此不知道将常量表达式实例化为什么类型。

关于c# - 其中 t : class generic constraint and const value declaration,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17817979/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com