繁体   English   中英

为什么受“枚举”约束的泛型类型在 C# 7.3 中无法作为“结构”?

[英]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> { }

正如贡献者 HaloFour 所解释的

这是 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.

 
粤ICP备18138465号  © 2020-2025 STACKOOM.COM