在c#中使用泛型+接口的原始类型

时间:2014-08-25 20:50:20

标签: c# generics interface

我发现解释我的问题的最好方法是通过以下示例。 为此,我们假设以下类:

public class Class1<C> where C : IInterface<C> 
{ 
   // some properties 
} 

现在我将界面定义为:

public interface IInterface<C>
{
   char CompareTo(C that);
   C defaultValue { set; get; }
}

现在我想将Class1与原始类型(例如,int)一起用作:

Class1<int> myClass = new Class1<int>();

然而,这是滥用,因为我可以使用类型int作为泛型中的类型参数。

有什么建议吗?

1 个答案:

答案 0 :(得分:4)

您在Class1<C>中添加了constraintC通用类型必须实现IInterface<C>。原因是int未实现IInterface<C>,因此您无法构建Class1<int>。在这种情况下,您将C泛型类型的约束设置为classstruct等特定类型,并使您的Class1&lt;&gt;一般实现接口,样本:

public class Class1<C> : IInterface<C>
    where C : struct
{
    public char CompareTo(C that)
    {
        throw new NotImplementedException();
    }

    public C defaultValue { get; set; }
}

public interface IInterface<C> where C : struct
{
    char CompareTo(C that);
    C defaultValue { set; get; }
}

并使用它。

Class1<int> c = new Class1<int>();

添加这样的约束时,您只需限制通用类型C即可。在这种情况下,只有value-type intdoublebool等等可以在通用中使用,但这不是必需的。如果需要,您可以删除并保留一般类型。它将作为object处理。