- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我编写了一个简单的扩展方法来帮助将字符串解析为可为空的枚举类型。
public static TEnum? ParseNullableEnum<TEnum>(this string? str)
where TEnum : Enum
{
if (str is null)
{
return null;
}
if (!Enum.TryParse(typeof(TEnum), str, ignoreCase: true, out var source))
{
throw new ArgumentOutOfRangeException(nameof(str), str, null);
}
return (TEnum)source;
}
如您所见,返回类型为 TEnum?
,其中 TEnum
是一个 Enum
。并且启用了 nullable,因此 null 是一个有效值。但是,我在 return null;
CS0403: Cannot convert null to type parameter 'TEnum' because it could be a non-nullable value type. Consider using default('TEnum') instead.
这是 VS 的 bug,还是我做错了什么?我没有转换为 TEnum
,输出类型是 TEnum?
...对吗?
最佳答案
你想要:
public static TEnum? ParseNullableEnum<TEnum>(this string? str)
where TEnum : struct, Enum
您遇到的问题是 Enum
约束可以匹配任何特定的枚举类型,或 Enum
类本身。 ( Enum
是一个奇怪的类型:它是所有枚举类型的基类型,但它本身是一种引用类型。它基本上代表一个装箱枚举类型,即您可以编写 Enum foo = condition ? ConsoleColor.Black : ConsoleKey.A;
,以选择两个随机不同的枚举类型) .
换句话说,有人可以调用:
ParseNullableEnum<Enum>("thing")
添加struct
约束迫使某人实际上传递特定的枚举类型,而不是 Enum
.
难题的另一部分是,如果泛型类型参数 T
不限于 class
或struct
,然后T?
意味着T
是“可默认”而不是“可空”。这意味着:
T
是一个引用类型,T?
允许null
待分配T
是一个值类型,T?
不意味着Nullable<T>
,它的含义与 T
相同.这是由于 T?
方式不同造成的由编译器针对引用和值类型实现。对于值类型,T?
是类型 Nullable<T>
的简写,但对于引用类型 T?
编译为与 T
相同的内容但仅对编译器警告有影响。编译器不可能发出返回类型为 T
的方法。当T
是引用类型,但是 Nullable<T>
当T
是一个值类型。
所以,通过不限制 T
对于引用或值类型,您的返回类型为 TEnum?
并不意味着Nullable<TEnum>
,它只是意味着 TEnum
具有不同的可为空警告。通过约束TEnum
对于值类型,编译器可以发出一个实际上返回 Nullable<TEnum>
的方法。 ,因此允许具有值 null
.
关于c# - 不允许为可为空的枚举返回 null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/76538286/
我是一名优秀的程序员,十分优秀!