我发现解释我的问题的最好方法是通过以下示例。 为此,我们假设以下类:
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
作为泛型中的类型参数。
有什么建议吗?
答案 0 :(得分:4)
您在Class1<C>
中添加了constraint
,C
通用类型必须实现IInterface<C>
。原因是int
未实现IInterface<C>
,因此您无法构建Class1<int>
。在这种情况下,您将C
泛型类型的约束设置为class
,struct
等特定类型,并使您的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
int
,double
,bool
等等可以在通用中使用,但这不是必需的。如果需要,您可以删除并保留一般类型。它将作为object
处理。