假设我有以下类(class):
public class GenericClass<T>
{
public T Find()
{
//return T if found otherwise null or Nullable<T>
}
}
我想在某个地方使用 T
来专门化我的类(class)用class
, 其他时候是 struct
.
我正面临这个issue : 我无法返回 Nullable<T>
如果T
type 不限于 struct
.
我想提供我的 Find
的实现如果 T
有效的方法专门用于 class
或 struct
.
万一Find
失败,我想返回 null
如果T
否则是一类 Nullable<T>
.
不使用反射是否可能?如果是怎么办?
最佳答案
您可以返回default(T)
.
对于一个类,这将是 null
.对于任何 Nullable<T>
, 这将是一个 Nullable<T>
没有值(实际上是 null
)。
话虽如此,如果您将其与 struct
一起使用而不是 Nullable<T>
作为类型,default(T)
将是结构的默认值。
如果你想让它对任何类或结构统一工作,你可能需要返回两个值 - 你可以在这里使用框架作为灵感,并有一个 TryXXX 方法,即:
public bool TryFind(out T)
然后您可以使用 default(T)
当找不到该值时,返回 false。这避免了对可空类型的需要。你也可以写这个返回一个 Tuple<bool, T>
或类似的,如果你想避免 out 参数,即:
public Tuple<bool, T> Find()
最后一个选项可能是让您的类成为非泛型类,然后使用一对泛型方法:
class YourClass // Non generic
{
public T FindReference<T>() where T : class
{
// ...
return null;
}
public Nullable<T> FindValue<T>() where T : struct
{
// ...
return default(T);
}
}
请注意,您需要不同的名称,因为您不能拥有完全基于返回类型的重载方法。
关于c# - 了解 C# 泛型和 Nullable 值类型。返回 null 或 nullable,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13143488/