문제

개념 '공분산'과 '불안정한'의 의미는 무엇입니까?

2 개의 수업이 주어지고 동물 그리고 코끼리 (상속 동물), 내 이해는 코끼리를 동물에 넣으려고 노력하면 런타임 오류를 얻을 수 있다는 것입니다. 코끼리는 동물보다 "더 큰"(더 구체적)이기 때문에 발생합니다. 그러나 동물을 코끼리 배열에 넣고 코끼리가 어떻게 동물 특성을 포함하는지 보는 것을 보게 될 수 있습니까?

도움이 되었습니까?

해결책

당신은 그것을 거꾸로 가지고 있습니다. 동물 어레이에 코끼리를 추가 할 수 있습니다. 이다 동물, 그리고 동물이 필요한 모든 방법을 보장합니다. 코끼리 어레이에 동물을 추가 할 수 없습니다. ~ 아니다 코끼리가 필요한 모든 방법을 가지고 있습니다.

위키 백과 기사 공분산 및 비정형 이것에 대한 좋은 설명이 있습니다.

프로그래밍 언어의 유형 시스템 내에서, 유형에서 유형으로의 연산자는 유형의 순서 (≤)을 보존하는 경우 더 구체적인 것의 유형을 더 일반적인 것에서보다 일반적인 것까지 주문하는 경우 공분산입니다. 이 순서를 되돌리면 비밀리에 있습니다. 이들 중 어느 것도 적용되지 않으면 운영자는 변하지 않습니다. 이 용어는 카테고리 이론에서 나옵니다.

또한, 당신은 Elephant 형이 "더 큰"것이라고 말했습니다. 이것은 그렇지 않습니다. 유형 동물은 코끼리, 기린 및 사자와 같은보다 구체적인 유형을 포함한다는 의미에서 "더 큰"것입니다.

다른 팁

C# 4.0의 공분산 및 비열한에 대한이 개요를 살펴보고 도움이되는지 확인하십시오.

http://blogs.msdn.com/charlie/archive/2008/10/27/linq-parm-covariance-and-contravariance-in-visual-studio-2010.aspx

45-49 페이지를 읽으십시오 Visual Studio 2010을 사용하여 .NET 4.0을 소개합니다 이 정확한 예를 다루는 것입니다. 코끼리의 멋진 사진도 있습니다.

꺼내야 할 요점은

var things = new List<IThing<IContent>> { new ConcreteThing() }

와 함께:

public class ConcreteThing : IThing<ConcreteContent>
{

}

인터페이스 정의에 "out"이 필요하므로보다 구체적인 양식을 설정할 수 있지만 ITHING에서 읽은 내용은보다 일반적인 유형이어야합니다.

public interface IThing<out T> where T : IContent
{
}

enter image description here

public interface IGoOut<out T>
{
    T Func();
}
public interface IComeIn<in T>
{
    void Action(T obj);
}
public class GoOutClass<T>:IGoOut<T>
{
    public T Func()
    {
        return default(T);
    }
}

public class ComeInClass<T> : IComeIn<T>
{
    public void Action(T obj) {  }
}

==========================================================
object obj = null;
//Covariance Example [Array +  IEnumerable<T> +  IEnumerator<T>  +  IInterface<Out T>  +  Func<T>]
object[] array = (string[]) obj;
IEnumerable<object> enumerable = (IEnumerable<string>) obj;
IEnumerator<object> enumerator = (IEnumerator<string>)obj;
IGoOut<object> goOut = (GoOutClass<string>)obj;
Func<object> func = (Func<string>)obj;


//Contravariance Example[IInterface<in T>]
IComeIn<string> comeIn = (ComeInClass<object>) obj;
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top