返回适用于引用和值类型的可为空的方法

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

我是这样开始的:

T? Foo<T>(T obj) //where T : struct
{
    return Random.Shared.Next() < 100 ? (T?)null : (T?)obj;
}

导致这个错误:

无法将 null 转换为“type”,因为它是不可为 null 的值类型

然后我添加了一个结构约束并且它起作用了:

T? Foo<T>(T obj) where T : struct
{
    return Random.Shared.Next() < 100 ? null : obj;
}

但是因为我还需要引用类型的这个功能,所以我添加了:

T? Foo<T>(T obj) where T : class
{
    return Random.Shared.Next() < 100 ? null : obj;
}

但这使编译器说“类型‘class’已经定义了一个名为‘member’的成员,具有相同的参数类型”。我怎样才能解决这个问题而不必给这些方法总是不同的名称,例如 FooValueType 和 FooReferenceType?

c# generics constraints nullable
1个回答
0
投票

尝试将泛型类型也声明为可空:

T? Foo<T?>(T? obj)

通过声明实际使用的泛型类型为可空,编译器应该会很高兴。

© www.soinside.com 2019 - 2024. All rights reserved.