>  기사  >  백엔드 개발  >  C# 일반 제약 조건에 대한 자세한 그래픽 및 텍스트 소개

C# 일반 제약 조건에 대한 자세한 그래픽 및 텍스트 소개

黄舟
黄舟원래의
2017-03-07 10:59:151577검색

이 문서에서는 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 및 CreateInstance가 모두 유효합니다. 그러나 CreateInstance8ac337f12ac35ec97e8dd89560472ecc에는 생성자가 없습니다.

4. 변환 유형 제약 조건

제약 조건을 사용하면 다른 유형을 지정할 수 있으며 일관성, 참조 또는 박싱 변환을 통해 암시적으로 변환할 수 있어야 합니다. . 유형 인수를 다른 유형 인수로 변환할 수 있도록 지정할 수도 있습니다. 이를 유형 매개변수 제약 조건이라고 합니다.

이해된 의미: 상호 교환 가능합니다. 즉, boxing 또는 강제 유형을 통해 대상 유형으로 변환할 수 있는 모든 유형을 사용하여 유형 매개변수를 전달할 수 있습니다.

class Sample

이 유효한 경우: Sample

은 유효하지 않습니다.:Sample String 유형은 참조나 boxing 및 unboxing을 통해 스트림으로 강제 변환될 수 없으므로

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( )
class Samplea62d1d8805a91a8900e4e7c7c3ba59db where T: Stream where U:IDispsable

Invalid:

class Sample8742468051c85b06f0a0af9e3e506b5c where T: class, struct(어떤 유형의 직접 참조도 없음) 값 유형이므로 유효하지 않습니다.)

class Sample8742468051c85b06f0a0af9e3e506b5c where T: Stream, class (참조 유형 제약 조건은 첫 번째 제약 조건이어야 하며 앞에 배치되므로 유효하지 않습니다.) Stream은 들어오는 매개변수를 Stream 특정 유형 으로 제한하는 반면 클래스는 참조 유형으로 제한합니다. 처음에는
class Sample8742468051c85b06f0a0af9e3e506b5c (new()는 끝에 배치되어야 합니다)

class Sample 여기서 T: IDisposable, Stream(class는 인터페이스 앞에 배치되어야 하므로 유효하지 않습니다)

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)를 참고해주세요!


성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.