在通用接口中实现可空类型

所以在之前的一个问题中,我询问了如何使用公共类和宾果实现一个通用接口,它的工作原理。 但是,我期望通过的其中一种类型是内置的可空类型之一,例如:int,Guid,String等。

这是我的界面:

public interface IOurTemplate<T, U>
    where T : class
    where U : class
{
    IEnumerable<T> List();
    T Get(U id);
}

所以当我这样实现时:

public class TestInterface : IOurTemplate<MyCustomClass, Int32>
{
    public IEnumerable<MyCustomClass> List()
    {
        throw new NotImplementedException();
    }

    public MyCustomClass Get(Int32 testID)
    {
        throw new NotImplementedException();
    }
}

我收到错误消息:类型'int'必须是引用类型才能将其用作泛型类型或方法'TestApp.IOurTemplate'中的参数'U'

我试图推断Int32类型?,但同样的错误。 有任何想法吗?


我不会真的这样做,但它可能是让它工作的唯一方法。

public class MyWrapperClass<T> where T : struct 
{
    public Nullable<T> Item { get; set; }   
}

public class MyClass<T> where T : class 
{

}

可空类型不满足classstruct约束:

C#语言规范v3.0(第§10.1.5节:类型参数约束):

引用类型约束指定用于类型参数的类型参数必须是引用类型。 所有类型,接口类型,委托类型,数组类型和已知为引用类型(如下定义)的类型参数均满足此约束条件。 值类型约束指定用于类型参数的类型参数必须是不可为空的值类型。

所有不可为空的结构类型,枚举类型和具有值类型约束的类型参数均满足此约束条件。 请注意,虽然归类为值类型,但可以为空的类型(第4.1.10节)不满足值类型约束。 具有值类型约束的类型参数不能具有构造函数约束。


为什么你需要将U型限制在课堂上?

public interface IOurTemplate<T, U>
    where T : class
{
    IEnumerable<T> List();
    T Get(U id);
}

public class TestInterface : IOurTemplate<MyCustomClass, Int32?>
{
    public IEnumerable<MyCustomClass> List()
    {
        throw new NotImplementedException();
    }

    public MyCustomClass Get(Int32? testID)
    {
        throw new NotImplementedException();
    }
}

供参考: int?Nullable<int>的C#简写。

链接地址: http://www.djcxy.com/p/43719.html

上一篇: Implementing Nullable Types in Generic Interface

下一篇: How to do Base64 encoding in node.js?