对于传入 T 可以是类或结构的泛型方法,是否可以返回可为 null 的 T?

问题描述 投票:0回答:1

虚拟代码:

        // 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,但该代码工作错误。我能做什么?

c# generics nullable
1个回答
0
投票

您没有指定类型参数,因此当您将其称为

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
© www.soinside.com 2019 - 2024. All rights reserved.