有没有办法定义一个带有约束的泛型接口,该约束可以为null(但不能是值类型)?

时间:2011-10-05 15:37:20

标签: c# .net generics nullable

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

3 个答案:

答案 0 :(得分:6)

编辑:鉴于问题标题,我假设您要将类型参数约束为而不是是不可为空的值类型。在问题 body 中指定它可能是个好主意。

不 - 没有这样的限制。实际上,classstruct约束都禁止可以为可为空的值类型的参数。

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

interface IFoo<T> { }

class FooClass<T> : IFoo<T> where T : class {}

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

当然,这不会阻止其他任何人实施IFoo<int>。如果您能给我们更多背景知识,我们可以提供更多帮助。

答案 1 :(得分:0)

This可能就是你要找的东西。

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

答案 2 :(得分:0)

是的,只需使用无约束就可以指定任何类型:

public interface IAllowReferenceTypes<T>
{
   T GetValue();
}

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

编辑:已修复。

注意:您要求在标题中使用约束,但如果您的问题只是要求允许可以为空的值类型和引用类型的接口,则在正文中。

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