왜 중간 값 유형의 C#이 조정이나 반전을 지원하지 않습니까? <..>
협업 및 인버터의 개념을 사용하면
는 협업 변경을 사용하고 슈퍼 유형을 수락 할 수 있습니다 (예 : 에 에 할당). 그러나이 동작은 와 같은 값 유형에는 적용되지 않습니다.
문서는이 한계가 차이가 참조 유형의 원리에만 적용 될 수 있기 때문이라고 지적합니다. 그 이유를 이해하기 위해 권투의 개념과 조정 및 인버터에 미치는 영향을 살펴 보겠습니다.
값 유형과 복싱의 역할
값 유형은 메모리에 직접 저장되며 그 값과 로고 분리가 없습니다. 값 유형이 참조 변수에 할당되면 프로세스를 상자라고합니다. 이 프로세스에서 값 유형은 값 유형의 메모리 위치를 포함하는 객체 포장 장치에 포장됩니다. 이 포장 장치를 사용하면 값 유형을 객체로 간주 할 수 있습니다. IEnumerable<T>
포장 및 분산 IEnumerable IEnumerable<object>
조정 효과를 만들려면 CLR은 참조 유형을 슈퍼 유형에 할당 할 때 표현되지 않도록해야합니다. 사용 코드가 작동중인 객체의 정확한 유형을 알 필요가 없기 때문입니다. 그러나 유형의 경우 객체 포장이 없습니다. 따라서 값 유형이 참조 변수에 할당되면 포장 작업이 필요합니다. 이 포장 작업은 값으로 표시되어 간접적 인 층을 도입합니다. IEnumerable<int>
식별과 제곱 차이
식별은 객체를 기본 유형 또는 파생 유형에 할당 할 때 동일한 식별자를 유지하는 기능입니다. 조정 된 변경에서 CLR 요청 객체의 식별이 유지됩니다. 그러나 값 유형의 경우 포장 및 박스 제거 작업이 예기치 않게 객체의 식별을 변경할 수 있습니다. 이것은 시너지 전환 로고의 특성을 위반합니다.
따라서 따라서 식별 및 참조의 효과를 보장하기 위해 CLR은 협업 및 인버터를 참조 유형으로 제한합니다.
위 내용은 C#에서 가치 유형이 공분산 또는 비결정이 아닌 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!