Home > Article > Backend Development > Detailed graphic and text introduction to C# generic constraints
本文将详细介绍C# 泛型的约束:引用类型约束;值类型约束;构造函数类型约束;转换类型约束;组合约束的相关知识。具有很好的参考价值,下面跟着小编一起来看下吧
1.引用类型约束
struct RefSample8742468051c85b06f0a0af9e3e506b5c where T:class 引用类型用Class表示约束,其他的引用类型为具体的约束。
表示对于的约束必须为一个类(引用类型)不能是值类型(int,char,datatime,struct),可以是接口interface
区分,数组为引用类型,因为定义数组时需要new出一个对象。
虽然定义成 RefSample8742468051c85b06f0a0af9e3e506b5c 传入的必须为引用类型 但是RefSample仍然为值类型
2.值类型约束
class ValSample8742468051c85b06f0a0af9e3e506b5c where T:struct
为引用类型,因为int,char等类型都是struct
ValSamplebd43222e33876353aff11e13a7dc75f6
3.构造函数类型约束
public T CreateInstance<T>() where T:new() { return new T(); }
指定的类型T必须有构造函数,CreateInstancebd43222e33876353aff11e13a7dc75f6和CreateInstance273238ce9338fbb04bee6997e5552b95 都是有效的。但是CreateInstance8ac337f12ac35ec97e8dd89560472ecc没有构造函数。
4.转换类型约束
一种约束允许你指定另一个类型,类型实参必须可以通过一致性、引用或装箱转换隐式地转换为该类型。你还可以规定一个类型实参必须可以转换为另一个类型实参——这称为类型参数约束。
理解的意思:可以互换,就是我们可以通过装箱或者强制类型转换成目标类型的 类型都可以用于类型参数传入。
class Sample8742468051c85b06f0a0af9e3e506b5c where T:Stream
有效:Sample7deb1b66c2439bfe6895a394cbb2197a 这本身符合约束
无效:Samplef7e83be87db5cd2d9a8a0b8117b38cd4 因为String类型无法通过引用或者装箱拆箱强制转换成Stream、
struct Sample8742468051c85b06f0a0af9e3e506b5c where T:IDisposable
规定T必须为IDisposable 类型的 引用类型
有效:Sampleee3398fcc71686d89f0818db05b7a88f引用转换
无效:Sample66631937a557270cbf0605de1ac49062
分析:为什么SqlConnection 可以而StringBuilder不可以?它们都是引用类型
1.SqlConnection实现了IDisposable接口,所以可以协变
2.StringBuilder只实现了ISerializable接口,无法通过途径转换为IDisposable
class Sample8742468051c85b06f0a0af9e3e506b5c where T:IComparable8742468051c85b06f0a0af9e3e506b5c
因为将IComparable8742468051c85b06f0a0af9e3e506b5c整体当作约束,分析IComparable8742468051c85b06f0a0af9e3e506b5c的类型,可以用Type.IsValueType判断,true为值类型,false为引用类型
typeof(IComparable8742468051c85b06f0a0af9e3e506b5c).IsValueType 结果为false表示为引用类型
有效:Samplebd43222e33876353aff11e13a7dc75f6(装箱转换)
无效:Sampled0869186ef29f1614dd65eb5411320d5
也可以指定多种约束:
class sample8742468051c85b06f0a0af9e3e506b5c where T:stream,IEnumerable98c455a79ddfebb79781bff588e7b37e,IComparablebd43222e33876353aff11e13a7dc75f6
class Samplea62d1d8805a91a8900e4e7c7c3ba59db where T:U
有效:Sample8ef407ed57caac12483dcecdcac4eb46
无效:Sample6f72722a2a297c03396b6f57d1a9f381
总结:要看传入类参数是否可以转换,查看规定参数和传入类参数是否实现同一接口,如果实现则可以,否则不可以。
不可以是以下:System.Object,System.Enum,System.ValueType,System.Delegate,结构或密封类(String)
5.组合约束
对类型参数的约束有多个,注意:只能是一种类型,值类型和引用类型不能同时存在,没用一个类型即是引用类型,又是值类型。
Since every value type has a constructorless function, there can be no constructor constraints thereafter
Valid:
class Sample8742468051c85b06f0a0af9e3e506b5c where T: class, IDisposable, new( )
class Samplea62d1d8805a91a8900e4e7c7c3ba59db where T: Stream where U:IDispsable
Invalid:
class Sample8742468051c85b06f0a0af9e3e506b5c where T: class,struct (no type instant reference The type is a value type, so it is invalid)
class Sample8742468051c85b06f0a0af9e3e506b5c where T: Stream, class (The reference type constraint should be the first constraint, placed at the front, so it is Invalid) Stream only constrains the incoming parameters to be Stream specific types, while class is constrained to reference types. I misunderstood it at first
class Sample8742468051c85b06f0a0af9e3e506b5c where T: new() ,Stream (new() must be placed at the end)
class Sample8742468051c85b06f0a0af9e3e506b5c where T: IDisposable, Stream (The class must be placed in front of the interface, so it is invalid)
class Sample8742468051c85b06f0a0af9e3e506b5c where T: XmlReader, IComparable, IComparable (For conversion type constraints, the same interface cannot appear multiple times)
class Sample< ;T, U> where T: struct where U: Class, T (The type parameter "T" has the "struct" constraint, so "T" cannot be used as a constraint of "U", so it is invalid)
class Samplec619abd6b5b072b4427165f6c9e6f6e4 where T:Stream ,U:IDisposable Syntax error
This is also true when I see this version on the InternetValidI don’t understand:
class Sample8742468051c85b06f0a0af9e3e506b5c where T: struct,IDisapsable IDisapsable is a value type?
##class Samplea62d1d8805a91a8900e4e7c7c3ba59db where T:class where U:struct ,T T is a reference type. Why constrain U together with the value type?
Hope you can correct me
The above is C# generics The content of the constraints is introduced in detail with pictures and texts. For more related content, please pay attention to the PHP Chinese website (www.php.cn)!