이 문서에서는 C# 제네릭의 제약 조건, 즉 참조 유형 제약 조건, 생성자 유형 제약 조건, 조합 제약 조건에 대해 자세히 소개합니다. 매우 좋은 참조 값을 가지고 있으니 아래 편집기로 살펴보겠습니다
1. 참조 유형 제약
struct RefSampleb32f285eaba7a6752dff0bc229700674 where T:class 참조 유형은 Class를 사용하여 제약 조건을 나타내고 다른 참조 유형은 특정 제약 조건을 나타냅니다.
은 제약 조건이 클래스(참조 유형)여야 하고 값 유형(int, char, datatime, struct)이 될 수 없으며 인터페이스
구별일 수 있음을 의미합니다. 배열은 다음과 같습니다. 배열을 정의할 때 new를 사용하여 객체를 생성해야 하기 때문에 참조 유형입니다.
RefSample8742468051c85b06f0a0af9e3e506b5c로 정의되어 있지만 들어오는 값은 참조 유형이어야 하지만 RefSample은 여전히 값 유형입니다
값 유형 제약
class ValSample8742468051c85b06f0a0af9e3e506b5c 여기서 T:struct
는 참조 유형입니다. 왜냐하면 int, char 및 기타 유형이 모두 struct
이기 때문입니다.ValSamplebd43222e33876353aff11e13a7dc75f6
3. 생성자 유형 제약
public T CreateInstance<T>() where T:new() { return new T(); }
지정된 유형 T에는 생성자가 있어야 하며 CreateInstance
4. 변환 유형 제약 조건
제약 조건을 사용하면 다른 유형을 지정할 수 있으며 일관성, 참조 또는 박싱 변환을 통해 암시적으로 변환할 수 있어야 합니다. . 유형 인수를 다른 유형 인수로 변환할 수 있도록 지정할 수도 있습니다. 이를 유형 매개변수 제약 조건이라고 합니다.
이해된 의미: 상호 교환 가능합니다. 즉, boxing 또는 강제 유형을 통해 대상 유형으로 변환할 수 있는 모든 유형을 사용하여 유형 매개변수를 전달할 수 있습니다.
class Sample
이 유효한 경우: Sample은 유효하지 않습니다.:Sample
struct Sample T는 IDisposable 유형의 참조 유형이어야 한다고 지정됩니다.
유효: 샘플ee3398fcc71686d89f0818db05b7a88f 참조 변환
유효: 샘플66631937a557270cbf0605de1ac49062
분석: 왜 SqlConnection은 가능하지만 StringBuilder는 불가능합니까? 모두 참조 유형입니다
1. SqlConnection은 IDisposable 인터페이스를 구현하므로 공변적일 수 있습니다
2. StringBuilder는 ISerialized 인터페이스만 구현하며 IDisposable로 변환할 수 없습니다class Sample8742468051c85b06f0a0af9e3e506b5c 여기서 T:IComparable8742468051c85b06f0a0af9e3e506b5c
IComparable8742468051c85b06f0a0af9e3e506b5c ;T>의 유형은 Type.IsValueType으로 판단할 수 있습니다. true는 값 유형이고 false는 참조 유형
typeof(IComparable8742468051c85b06f0a0af9e3e506b5c).IsValueType참조 유형으로 false로 표시되는 결과 유효: Samplebd43222e33876353aff11e13a7dc75f6(boxing 변환)
유효하지 않음: Sampled0869186ef29f1614dd65eb5411320d5 여러 제약 조건을 지정할 수도 있습니다. : 클래스 샘플8742468051c85b06f0a0af9e3e506b5c 여기서 T: stream, IEnumerable98c455a79ddfebb79781bff588e7b37e,IComparablebd43222e33876353aff11e13a7dc75f6클래스 샘플
유효: 샘플
요약: 들어오는 클래스 매개변수를 변환할 수 있는지, 지정된 매개변수와 들어오는 클래스 매개변수가 동일한 인터페이스를 구현하는지 여부에 따라 다릅니다. 그렇다면 괜찮지만 그렇지 않으면 불가능합니다.
은 System.Object, System.Enum, System.ValueType, System.Delegate, 구조체 또는 봉인 클래스(문자열)일 수 없습니다.
5. 조합 제약
참고: 한 가지 유형만 가능하며 값 유형과 참조 유형은 존재할 수 없습니다. 동시에, 유형이 참조 유형이면서 값 유형일 필요는 없습니다. 모든 값 유형에는 생성자가 없는 함수가 있으므로 이후에는 생성자 제약 조건이 있을 수 없습니다. 유효: class Sample8742468051c85b06f0a0af9e3e506b5c where T: class, IDisposable, new( ) Invalid: class Sample8742468051c85b06f0a0af9e3e506b5c where T: class, struct(어떤 유형의 직접 참조도 없음) 값 유형이므로 유효하지 않습니다.) class Sample8742468051c85b06f0a0af9e3e506b5c where T: Stream, class (참조 유형 제약 조건은 첫 번째 제약 조건이어야 하며 앞에 배치되므로 유효하지 않습니다.) Stream은 들어오는 매개변수를 Stream 특정 유형 으로 제한하는 반면 클래스는 참조 유형으로 제한합니다. 처음에는 class Sample class Sample8742468051c85b06f0a0af9e3e506b5c where T: ;T, U> where T: struct where U: Class, T (유형 매개변수 "T"에는 "struct"가 있습니다. 제약 조건이므로 "T"는 "U"의 제약 조건으로 사용할 수 없으므로 유효하지 않습니다) class Samplec619abd6b5b072b4427165f6c9e6f6e4 여기서 T:Stream ,U:IDisposable 구문 오류 온라인에도 이 버전이 있는 걸 보니유효 이해가 안 돼요: class 샘플8742468051c85b06f0a0af9e3e506b5c 여기서 T: struct,IDisapsable IDisapsable은 값 유형입니까? class Samplea62d1d8805a91a8900e4e7c7c3ba59db 여기서 T: U:struct,T T가 참조 유형인 클래스입니다. 왜 U를 값 유형으로 제한합니까? 수정해주셨으면 좋겠습니다
위 내용은 C# generics 제약사항의 내용은 사진과 글로 자세히 소개되어 있으니, 더 많은 관련 내용은 PHP 중국어 홈페이지(www.php.cn)를 참고해주세요!
class Samplea62d1d8805a91a8900e4e7c7c3ba59db where T: Stream where U:IDispsable
class Sample8742468051c85b06f0a0af9e3e506b5c (new()는 끝에 배치되어야 합니다)