【发布时间】:2018-10-25 08:52:17
【问题描述】:
既然我们有枚举约束,为什么编译器不允许我写这段代码?
public static TResult? ToEnum<TResult>(this String value, TResult? defaultValue)
where TResult : Enum
{
return String.IsNullOrEmpty(value) ? defaultValue : (TResult?)Enum.Parse(typeof(TResult), value);
}
编译器说:
错误 CS0453 类型“TResult”必须是不可为空的值类型,才能将其用作泛型类型或方法“Nullable”中的参数“T”
【问题讨论】:
-
@DanielleSummers 至少在 C#8 之前我们可以得到可为空的引用类型...
-
@DavidG - 同时我还在等待不可为空的引用类型...
-
@JamesFaix 它不应该是一个新的通用约束。这是相同的约束,在 CIL 中一直有效,但在 C# 中一直受到人为限制,直到 7.3。因此,我不认为将其报告为错误会有用。
-
@KirillKovalenko:
System.Enum是special class(无论如何都不能用作类型参数约束)。它非常特别,它继承自System.ValueType,但却是一个引用类型。 stackoverflow.com/questions/14561338/… -
@mjwills 因为
Enum基类在.NET 类型层次结构中是一个奇怪的情况,并且从它继承的所有类都是值类型。我认为新的约束类似于class或struct约束,而不仅仅是允许以前禁止的基类约束。