[英]Why is a generic type constrained by 'Enum' failing to qualify as a 'struct' in C# 7.3?
如果我有一个带有struct
约束的通用接口,如下所示:
public interface IStruct<T> where T : struct { }
我可以像这样提供一个枚举作为我的类型T
,因为enum
满足struct
约束:
public class EnumIsAStruct : IStruct<DateTimeKind> { }
C# 7.3 添加了Enum
约束。 以下代码以前是非法的,现在可以编译:
public class MCVE<T> : IStruct<T> where T : struct, Enum { }
但是,令我惊讶的是,以下内容无法编译:
public class MCVE<T> : IStruct<T> where T : Enum { }
...有错误
CS0453 类型“T”必须是不可为空的值类型,才能将其用作泛型类型或方法“IStruct”中的参数“T”
为什么是这样? 我希望受Enum
约束的泛型类型可用作类型参数,其中类型受struct
约束,但情况似乎并非如此 - 我必须将Enum
约束更改为struct, Enum
。 我的期望错了吗?
这个问题很奇怪(可以说),但预期的行为。
类System.Enum
本身可以作为T
的类型提供。 作为一个类, System.Enum
当然不是一个struct
!
public class MCVE<T> where T : Enum { }
public class MCVE2 : MCVE<Enum> { }
这是 CLR 本身的奇怪行为。
System.Enum
是一个类,但从System.Enum
派生的每个类型都是一个struct
。 因此,对System.Enum
本身的约束并不意味着struct
因为您可以将System.Enum
作为泛型类型参数传递...这很奇怪,但简单地消除对编译器的强加限制比争论可能具有不同行为的“枚举”约束的不同语法更容易。
解决方案是struct, Enum
当您希望将具体类型限制为任何特定枚举时struct, Enum
将限制为struct, Enum
成为您的标准做法。 如果您另外希望接受类System.Enum
作为您的泛型类型,那么您才会限制为Enum
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.