/**//*主要约束:类型参数可以指定0或者1个主要的泛型约束,主要约束可以是值类型也可以是引用类型,指定引用类型时,那么就意味着参数必须是这个引用类型或者从这个引用类型派生,还有两个特殊的主要约束:即class和struct约束,下面看一下代码:*/ internalsealedclass PrimaryConstraintOfStream<T>where T : Stream ...{ publicvoid M(T stream) ...{ stream.Close();// OK } } PrimaryConstraintOfStream<Stream> pcs=new PrimaryConstraintOfStream<Stream>(); // 合法 PrimaryConstraintOfStream<FileStream> pcs=new PrimaryConstraintOfStream<FileStream>(); //合法 PrimaryConstraintOfStream<int> pcs=new PrimaryConstraintOfStream<int>(); //非法 //class约束 internalsealedclass PrimaryConstraintOfClass<T>where T : class...{ publicvoid M() ...{ T temp =null; //合法,因为已经约束了T为引用类型 } } //struct约束 internalsealedclass PrimaryConstraintOfStruct<T>where T : struct...{ publicstatic T Factory() ...{ returnnew T(); } }
/**//*次要约束:一个类型参数可以指定0个或者多个次要约束。次要类型代表的是一个接口约束。还有一种辅助约束是类型参数之间必须存在某种关系。下面看个例子:*/ privatestatic List<TBase> ConvertIList<T, TBase>(IList<T> list) where T : TBase ...{ List<TBase> baseList =new List<TBase>(list.Count); for (Int32 index =0; index < list.Count; index++) ...{ baseList.Add(list[index]); } return baseList; } privatestaticvoid CallingConvertIList() ...{ IList<String> ls =new List<String>(); ls.Add("A String"); IList<Object> To = ConvertIList<String, Object>(ls); IList<IComparable> lc = ConvertIList<String, IComparable>(ls); IList<IComparable<String>> lcs =ConvertIList<String, IComparable<String>>(ls); IList<String> ls2 = ConvertIList<String, String>(ls); IList<Exception> le = ConvertIList<String, Exception>(ls); // Error,string类型和Exception没有关系 }
//构造器约束:一个指定的类型实参实现了一个public无参构造器的一个非抽象类型。如果同时指定了构造器约束和struct约束,编译器会报错,因为值类型都隐式的提供了一个无参构造器*/ internalsealedclass ConstructorConstraint<T>where T : new() ...{ publicstatic T Factory() ...{ returnnew T(); //指定了构造器约束,我们可以肯定能够返回一个T类型的实例 } }
下面我们在看一些其他的问题:
privatestaticvoid SettingAGenericTypeVariableToDefaultValue<T>() ...{ T temp =default(T); // OK } //如果我们在不指定约束的时候想初始化T类型,那么我们必须使用default关键字,这样当T是引用类型时,temp被初始化为null,如果T为值类型temp被初始化为0
还有就是一些基元操作符(/,*,+,-,等等)不能应用在泛型参数上:
privatestatic T Sum<T>(T num) where T : struct...{ T sum =default(T) ; for (T n =default(T); n < num; n++) sum += n; return sum; } //编译器报错 • error CS0019: Operator '<' cannot be applied to operands of type 'T' and 'T' • error CS0023: Operator '++' cannot be applied to operand of type 'T' • error CS0019: Operator '+=' cannot be applied to operands of type 'T' and 'T'