我是这样开始的:
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?
尝试将泛型类型也声明为可空:
T? Foo<T?>(T? obj)
通过声明实际使用的泛型类型为可空,编译器应该会很高兴。