虚拟代码:
// TSource1 elementObj can be struct or can be class object and never can be nullable struct or null (because method inner code will create Exceptions in that case)
public static TSource1? ReturnNullOrNotNullTSource1<TSource1>(TSource1 elementObj)
{
// making some checkings for elementObj, if chekings have passed I need to return that elementObj back, if chekings have not passed I need to return null (so I used TSource1? as a method return type).
// ...
return (passed) ? elementObj : default(TSource1?);
}
在检查未通过且代码已编译的情况下,我可以返回默认值(TSource1?),但是当我使用 TSource1=DateOnly 测试它时,我看到返回的实际对象不是 null 而是“01.01.0001”。它返回默认值(TSource1)而不是默认值(TSource1?),这对我来说是不正确的,因为我不知道检查是否未通过或在这种情况下已通过:
var result = ReturnNullOrNotNullTSource1(new DateOnly(0001, 1, 1));
我希望我可以为传入的不可空结构 T 返回可空结构 T,但该代码工作错误。我能做什么?
您没有指定类型参数,因此当您将其称为
ReturnNullOrNotNullTSource1(new DateOnly(0001, 1, 1));
时,类型参数将被推断为DateOnly
。
但是由于类型参数
TSource1
是无约束的,所以TSource1?
的含义并不如你想象的那样,你可以在这个链接中找到规则。
如果
的类型参数是值类型,则T
引用相同的值类型T?
。例如,如果T
是T
,则int
也是T?
。int
因此
default(TSource1?)
相当于 default(DateOnly)
。
您可以指定类型参数
ReturnNullOrNotNullTSource1<DateOnly?>(new DateOnly(0001, 1, 1));
或添加结构约束
public static TSource1? ReturnNullOrNotNullTSource1<TSource1>(TSource1 elementObj)
where TSource1 : struct