gpt4 book ai didi

c# - 不允许为可为空的枚举返回 null

转载 作者:行者123 更新时间:2023-12-03 07:53:44 27 4
gpt4 key购买 nike

我编写了一个简单的扩展方法来帮助将字符串解析为可为空的枚举类型。

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不限于 classstruct ,然后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/

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