【发布时间】:2019-12-05 16:17:57
【问题描述】:
我有一个函数:
public static object? ToType(Type type, object? value)
我想创建一个有用的快捷方式,例如:
public static T ToType<T>(object? value)
{
return (T)ToType(typeof(T), value);
}
启用可空检查的 C# 8.0 编译器给出以下警告:
CS8601:可能的空引用分配。
函数接受string、int 和其他类型,所以我不能设置像class 这样的通用约束。此外,它可以返回null。使用T? 进行强制转换和返回会导致编译器错误。
有没有办法修复警告?
【问题讨论】:
-
return ToType(typeof(T), value) as T;?或者您可以使用 pragma 或 attrbute 来抑制警告 -
好吧,如果您将
int作为T传递并且null的值将引发异常-因为您不能将null 转换为int(同样适用于其他类型例如布尔值等)。在这种情况下,您希望发生什么?我建议也许有两个单独的方法,或者检查不可为空的类型并为不可为空的类型返回默认值? I've answered something similar here if you want to have a look. -
@Eldar 我可能不会掩盖这样的警告。这个警告实际上应该在代码接触生产环境之前修复。
-
如果
T被替换为string会怎样?来电者会得到一个不好的惊喜。您应该考虑返回[MaybeNull]T,然后在方法主体内禁止警告(当返回[MaybeNull]T时,编译器还不会自动执行此操作。 -
这有点违背了强类型语言的目的......
标签: c# nullable c#-8.0 nullable-reference-types