c# - 了解 C# 泛型和 Nullable 值类型。返回 null 或 nullable

标签 c# generics mono null nullable

假设我有以下类(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 有效的方法专门用于 classstruct . 万一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/

相关文章:

c# - 同时使用同一用户控件的多个实例

c# - 错误 :The given path's format is not supported

java - 使用 java.lang.reflect.Type 检查实例

c# - 构造/制作通用类型并将类型约束转换为结构作为基础类型的约束

.net - 正在寻找使用 .NET 和 Mono 开发 iPhone 应用程序的好教程

c# - 将 c# 2.0 BL/DL 和 webservice/wcf 代码移植到 linux(使用 oracle DB)

c# - Dapper 版本 1.12.0.0 XML 参数不再有效

c# - 如何在同一解决方案中从 C++/CLi 项目引用 C# 项目

java - `Iterable` 的接口(interface)转换

c# - 使用 Mono.Cecil 更改应用程序类型?