我想做这样的事情:
myYear = record.GetValueOrNull<int?>("myYear"),
Run Code Online (Sandbox Code Playgroud)
请注意可空类型作为通用参数.
由于该GetValueOrNull函数可以返回null,我的第一次尝试是这样的:
public static T GetValueOrNull<T>(this DbDataRecord reader, string columnName)
where T : class
{
object columnValue = reader[columnName];
if (!(columnValue is DBNull))
{
return (T)columnValue;
}
return null;
}
Run Code Online (Sandbox Code Playgroud)
但我现在得到的错误是:
类型'int?' 必须是引用类型才能在泛型类型或方法中将其用作参数"T"
对!Nullable<int>是一个struct!所以我尝试将类约束更改为struct约束(并且副作用不能再返回null):
public static T GetValueOrNull<T>(this DbDataRecord reader, string columnName)
where T : struct
Run Code Online (Sandbox Code Playgroud)
现在任务:
myYear = record.GetValueOrNull<int?>("myYear");
Run Code Online (Sandbox Code Playgroud)
给出以下错误:
类型'int?' 必须是非可空值类型才能在泛型类型或方法中将其用作参数"T"
是否可以将可空类型指定为通用参数?
我想创建一个具有type成员的泛型类T。T可以是类,可为空的类,结构或可为空的结构。所以基本上什么都可以。这是一个简化的示例,显示了我的问题:
#nullable enable
class Box<T> {
public T Value { get; }
public Box(T value) {
Value = value;
}
public static Box<T> CreateDefault()
=> new Box<T>(default(T));
}
Run Code Online (Sandbox Code Playgroud)
由于使用了新#nullable enable功能,我得到以下警告:Program.cs(11,23): warning CS8653: A default expression introduces a null value when 'T' is a non-nullable reference type.
这个警告对我来说很有意义。然后,我尝试通过?在属性和构造函数参数中添加来修复此问题:
#nullable enable
class Box<T> {
public T? Value { get; }
public Box(T? value) {
Value = value;
}
public static Box<T> CreateDefault()
=> …Run Code Online (Sandbox Code Playgroud) 我正在将代码库转换为具有可为空引用类型的 C#8。我遇到了一种类似于这个问题中的方法但异步的方法。
public async Task<T> GetAsync<T>()
{
// sometimes returns default(T); => warning CS8603 Possible null reference return
}
Run Code Online (Sandbox Code Playgroud)
T 可以是任何类型,包括可为空的引用类型或可为空的值类型。
明确地说,我理解为什么这种方法会触发警告。我想知道的是可以使用哪些注释来解决它。
default(T)!,但我希望有一些不那么“锤子”的东西。[return: MaybNull]因为那将适用于它Task本身,而不适用于T.我可以应用任何其他属性/注释来使编译器满意,还是default(T)!我唯一的选择?