一个基础类方面的问题
public abstract class BaseProvider<EntityType, CollectionType>where CollectionType : List<EntityType>, new()
where EntityType : new()
{
。。。。
}
这是个抽象类,请教一下,这个类的定义是怎么样的?比如where关键字是什么意思,:号是什么意思? --------------------编程问答-------------------- 约束与继承 --------------------编程问答-------------------- 约束。 --------------------编程问答-------------------- public abstract class BaseProvider <chinese wholesalers
ugg, CollectionType>
where CollectionType : List <EntityType>, new()
where EntityType : new() --------------------编程问答-------------------- C#中的泛型只支持显示的约束,因为这样才能保证C#所要求的类型安全,但显示的约束并非时必须的,如果不加约束,泛型类型参数将只能访问System.Object类型中的公有方法。“显式约束”由where子句表达,可以指定“基类约束”,“接口约束”,“构造器约束”,“值类型/引用类型约束”共四种约束。下面的例子来源于李建忠老师的讲座PPT。
1、基类约束:
class A { public void F1() {} }
class B { public void F2() {} }
class C< S,T> where S: A // S继承自A
where T: B // T继承自B
{ // 可以在类型为S的变量上调用F1, // 可以在类型为T的变量上调用F2 } --------------------编程问答-------------------- 这是泛型约束...去看看MSDN...
where(泛型类型约束)(C# 编程指南)
ps:这个命名不太好,不符合命名约定,容易让调用者混淆...泛型类型应该加T前缀,另外如果可行的话List<T>改成IList<T>或IEnumerable<T>等接口类型适应性更好...如下...
public abstract class BaseProvider <TEntity, TEntityCollection>
where TEntityCollection : IList<TEntity>, new()
where TEntity : new() --------------------编程问答-------------------- 泛型约束,C#2.0新特性 --------------------编程问答-------------------- 又看到这个帖子...发现不止是命名的问题,整个一个多余...只需要改成下面这样就满足要求了...
public abstract class BaseProvider <T, IList<T>>
where T : new() --------------------编程问答-------------------- 还是有点区别的吧IList <T>和where TEntityCollection : IList <TEntity>, new() 比,TEntityCollection 可以实例化。
--------------------编程问答-------------------- 难道IList<T>不可以实例化?new()约束只是为了声明该泛型类型可以在泛型方法体内实例化...
所以该示例CollectionType的写法纯属多余... --------------------编程问答-------------------- 对啊,就是为了这个约束啊
--------------------编程问答-------------------- C#泛型
http://hi.baidu.com/brady_home/blog/item/53a36809d68780aa2fddd467.html
很不错的帖子,参考一下。
补充:.NET技术 , C#