是否有一种方法可以定义一个泛型接口,该接口具有类型可以为空(但不能为值类型)的约束

本文关键字:类型 约束 接口 但不能 一个 方法 一种 定义 泛型接口 是否 | 更新日期: 2023-09-27 18:10:42

我想定义一个通用接口,允许可空值类型(int?、双吗?等)和类类型(也可以为null)。我不想允许使用简单的值类型。有办法做到这一点吗?

是否有一种方法可以定义一个泛型接口,该接口具有类型可以为空(但不能为值类型)的约束

编辑:给定问题标题,我假设您希望将类型参数约束为,而不是为非空值类型。在问题正文中指定 too可能是个好主意。

没有——没有这样的约束。事实上,classstruct约束都禁止可空值类型的参数。

您可以在没有约束的情况下创建接口,但只创建两个实现:

interface IFoo<T> { }
class FooClass<T> : IFoo<T> where T : class {}
class FooNullableValue<T> : IFoo<Nullable<T>> where T : struct {}

这当然不会阻止其他人实现IFoo<int>。如果你能给我们更多的背景资料,我们也许能帮上更多的忙。

可以,只要不使用约束就可以指定任何类型:

public interface IAllowReferenceTypes<T>
{
   T GetValue();
}
public class SomeClass : IAllowReferenceTypes<Int32?>
{
   public Int32? GetValue() { return null; }
}
编辑:

注意:你在标题中要求约束,但在正文中,如果你的问题只要求一个允许空值类型和引用类型的接口。

不使用约束可以实现后者。正如Jon的回答所指出的,没有办法使用约束来保证类型是可空的。但是,您可以不使用约束并检查null(或default(T))

这可能就是你要找的。

Greg Dean的回答:


将返回类型更改为Nullable,并调用带有非空参数的方法

static void Main(string[] args)
{
    int? i = GetValueOrNull<int>(null, string.Empty);
}

public static Nullable<T> GetValueOrNull<T>(DbDataRecord reader, string columnName) where T : struct
{
    object columnValue = reader[columnName];
    if (!(columnValue is DBNull))
        return (T)columnValue;
    return null;
}

另外,请参阅以下MSDN关于通用接口的文章:http://msdn.microsoft.com/en-us/library/kwtft8ak.aspx