프레임 워크에는 특수 특성을 파생 된 모든 유형에 효과적으로 전달 하지만 그 특성 자체를 소유하지는 않는 특정 클래스가 있습니다 . CLR 자체는 이러한 클래스를 제약 조건으로 사용하는 것을 금지하지 않지만, 이에 제한되는 제네릭 형식은 구체적인 형식과 달리 상속되지 않은 특성을 얻지 못합니다. C #의 작성자는 이러한 동작이 일부 사람들에게 혼란을 줄 수 있고 유용성을 보지 못하기 때문에 이러한 제약 조건이 CLR 에서처럼 동작하도록 허용하기보다는 금지해야한다고 결정했습니다.
예를 들어 다음과 같이 쓸 수있는 경우 : void CopyArray<T>(T dest, T source, int start, int count)
; 하나는 유형의 인수를 예상하는 메소드 dest
와 전달할 수 있습니다 . 또한, 하나는 컴파일시의 검증이를 얻을 것 와 호환되는 배열 형했지만, 하나는 사용하여 배열의 액세스 요소 수 없을 것 연산자.source
System.Array
dest
source
[]
Array
제약 조건 으로 사용할 수없는 것은 대부분 해결하기가 매우 쉽습니다 void CopyArray<T>(T[] dest, T[] source, int start, int count)
. 이전 방법이 작동하는 거의 모든 상황에서 작동하기 때문입니다. 그러나 약점이 있습니다. 전자의 방법은 System.Array
인수가 호환되지 않는 배열 유형 인 경우를 거부하면서 인수 중 하나 또는 둘 모두가 유형 인 시나리오에서 작동 합니다. 두 인수가 모두 유형 인 오버로드를 추가하면 System.Array
코드가 허용해야하는 추가 사례를 수락 할 수 있지만 허용해서는 안되는 사례를 잘못 수락하게됩니다.
나는 대부분의 특수 제약을 불법화하기로 결정했습니다. 의미 론적 의미가 0 인 유일한 것은 System.Object
[제약으로서 합법적이라면 어떤 것이라도 그것을 만족시킬 것이기 때문에] 일 것입니다. System.ValueType
유형의 참조는 ValueType
값 유형과 실제로 공통점이 많지 않기 때문에 유용 하지 않을 수 있지만 Reflection과 관련된 경우에는 그럴듯하게 가치가있을 수 있습니다. 모두 System.Enum
와 System.Delegate
진짜 용도가 것이지만, C #의 창조자들을 생각하지 않았기 때문에 그들이 더 좋은 이유에 대해 금지하고 있습니다.