如何在C#泛型类中约束类型实现指定泛型接口
泛型类型参数约束实现方法
要强制泛型类的类型参数实现指定泛型接口,需要使用C#内置的where泛型约束语法,你注释里直接把接口写在泛型参数声明位置的写法是不合法的——尖括号在泛型类声明时的作用是声明类型形参,不是定义约束规则。
标准实现写法
你需要显式声明所有用到的类型形参,再通过where子句给对应参数添加实现接口的约束:
public interface IGeneric<T> { T Value {get;} } // 声明两个类型形参:T是IGeneric接口的泛型参数,TElement是集合存储的元素类型 // 通过where约束TElement必须实现对应T的IGeneric<T>接口 public class MyList<T, TElement> where TElement : IGeneric<T> { // 类内部实现逻辑 }
使用示例
先定义一个实现IGeneric<T>的具体类型:
public class IntItem : IGeneric<int> { public int Value { get; set; } }
你可以正常声明合法的泛型实例:
// 合法:IntItem实现了IGeneric<int> var list = new MyList<int, IntItem>();
如果传入没有实现对应接口的类型作为TElement,编译器会直接抛出编译错误,从语法层面强制类型符合要求。
简化泛型参数的可选方案
如果你不想在声明MyList时额外指定T类型,可以给泛型接口加一个非泛型的父接口:
// 非泛型基接口 public interface IGeneric { object Value { get; } } public interface IGeneric<T> : IGeneric { new T Value { get; } } // 此时只需要声明一个类型形参,约束为实现非泛型IGeneric接口即可 public class MyList<TElement> where TElement : IGeneric { // 内部逻辑 }
这种写法的缺点是读取Value属性时默认得到object类型,需要自行做类型转换。
你注释里的
public class MyList<IGeneric<T>> {}写法不成立的核心原因是:C#不支持在泛型形参声明位置直接嵌套泛型接口作为隐式约束,所有类型参数的规则必须通过where子句显式定义。
内容的提问来源于stack exchange,提问作者Jarosław Pietras
相关产品推荐
相关产品推荐

