泛型的限定驾驭,泛型节制通晓

图片 1

泛型的牢笼明白,泛型约束驾驭

1.引用类型约束 struct RefSample<T> where T:class         引用类型用Class表示节制,别的的援用类型为现实的牢笼。 表示对此的封锁必得为二个类(引用类型)不能够是值类型(int,char,datatime,struct),能够是接口interface 区分,数组为援引类型,因为定义数组时索要new出贰个对象。 即便定义成 RefSample<T> 传入的总得为引用类型 但是RefSample仍是值类型   2.值体系约束 class Val萨姆ple<T> where T:struct 为援用类型,因为int,char等门类皆以struct 图片 2 ValSample<int> 3.布局函数类型限制 public T CreateInstance<T>(卡塔尔 where T:new(卡塔尔国 {      return new T(卡塔尔(قطر‎; } 钦点的类型T必得有布局函数,CreateInstance<int>和CreateInstance<object> 都以卓有功效的。不过CreateInstance<strings>未有构造函数。 4.转变类型限定 风度翩翩种约束允许你钦点另三个项目,类型实参必需可以透过大器晚成致性、援用或装箱调换隐式地转移为该类型。你仍可以够规定四个体系实参必需能够转移为另三个连串实参——这称之为类型参数约束。 明白的情趣:可以调换,正是大家能够通过装箱或许免强类型转变来靶子项目标类型都得以用于项目参数字传送入。 class Sample<T> where T:Stream 有效:萨姆ple<Stream> 那本人切合限制 无效:萨姆ple<String> 因为String类型不可能透过引用只怕装箱拆箱压迫转变来Stream、   struct 萨姆ple<T> where T:IDisposable 规定T必需为IDisposable 类型的 援用类型 有效:萨姆ple<SqlConnection>援用调换无效:Sample<StringBuilder> 深入分析:为什么SqlConnection 可以而StringBuilder不得以?它们都是援引类型 1.SqlConnection完毕了IDisposable接口,所以能够协变 图片 3     图片 4 2.StringBuilder只兑现了ISerializable接口,不恐怕通过门路调换为IDisposable  图片 5 class Sample<T> where T:IComparable<T> 因为将IComparable<T>全部当做约束,剖析IComparable<T>的类别,能够用Type.IsValueType推断,true为值类型,false为援引类型 typeof(IComparable<T>卡塔尔国.IsValueType   结果为false表示为援引类型   有效:Sample<int>(装箱调换) 无效:Sample<FileInfo>   也足以内定多样封锁: class sample<T> where T:stream,IEnumerable<string>,IComparable<int>   class 萨姆ple<T,U> where T:U 有效:Sample<Stream,IDisposable> 无效:萨姆ple<string,IDiposable> 总计:要看传入类参数是或不是足以转移,查看规定参数和传布类参数是不是落成平等接口,假使完成则足以,不然无法。 不可能是以下:System.Object,System.Enum,System.ValueType,System.Delegate,构造或密闭类(String卡塔尔 5.组合约束 对项目参数的羁绊有四个,注意:只可以是黄金年代体系型,值类型和援引类型不能够同一时候设有,没用三个档案的次序正是征引类型,又是值类型。 由于每多个值类型都有二个无布局函数,今后不可能再有构造函数限制 有效: class Sample<T> where T:class,IDisposable,new(卡塔尔(قطر‎ class 萨姆ple<T,U> where T:Stream where U:IDispsable 无效: class Sample<T> where T:class,struct (未有其他类型即时援引类型又是值类型的,所感觉无效的State of Qatarclass 萨姆ple<T> where T:Stream,class (引用类型限定应为第四个节制,放在最前头,所感到无效的卡塔尔(قطر‎Stream只是节制传入参数为Stream具体品种,而class约束为引用类型,一伊始本身掌握错了 class Sample<T> where T:new(卡塔尔(قطر‎,Stream   (new(State of Qatar 必得放在最后卡塔尔国 class Sample<T> where T:IDisposable,Stream (类必须放在接口前面,所以为无效的State of Qatar class Sample<T> where T:XmlReader,IComparable,IComparable (对于转换类型约束,同五个接口无法冒出多次) class Sample<T,U> where T:struct where  U:Class,T (类型形参“T”具备“struct”约束,由此“T”不可能同等对待“U”的自律,所感觉无效的卡塔尔国class 萨姆ple<T,U> where T:Stream ,U:IDisposable  语法错误   看见互连网还会有这种本子也可以有效的作者代表不明白: class 萨姆ple<T> where T:struct,IDisapsable  IDisapsable为值类型? class Sample<T,U> where T:class where U:struct ,T   T为援用类型为什么与值类型一齐约束U? 希望得以指正

1.引用类型节制struct Ref萨姆pleT where T:class 援引类型用Class表示节制,别的的引用类型为实际的牢笼。 表示对...