public class P { }
public class B : P { }
public class A : P { }
public interface Interface<T> where T : P { }
public class IA : Interface<A> { }
public class IB : Interface<B> { }
public class Test
{
public void WhatTheFuck()
{
Interface<P> p;
p = new IA();// cast error here
p = new IB();// cast error here
//... somthing about interface<p>
}
}
이 오류가 발생합니다.
심각도 코드 설명 프로젝트 파일 줄 억제 상태 오류 CS0266 'AssUploaderSystem.IA'유형을 'AssUploaderSystem.Interface'로 암시 적으로 변환 할 수 없습니다.
클래스 A & B도 클래스 P로 구현되기 때문에 일반적인 솔루션을 만들고 싶습니다.
그래서 한 번만 쓰고 싶지만 어떤 클래스로 캐스팅 할 수 없습니다. 어떻게해야합니까?
공분산-반 분산 및 제네릭 인터페이스의 분산 을 이해해야합니다.
인터페이스의 제네릭 형식 매개 변수를 공변 또는 반 변성으로 선언 할 수 있습니다. 공분산을 사용하면 인터페이스 메서드가 제네릭 형식 매개 변수에 정의 된 것보다 더 많은 파생 반환 형식을 가질 수 있습니다. Contravariance는 인터페이스 메소드가 일반 매개 변수에 의해 지정된 것보다 덜 파생 된 인수 유형을 가질 수 있도록합니다. 공변 또는 반 변성 제네릭 유형 매개 변수가있는 제네릭 인터페이스를 변형이라고합니다.
지적했듯이 다음을 사용하여 작동하도록 만들 수 있습니다.
public class P { }
public class B : P { }
public class A : P { }
public interface Interface<out T> where T : P { }
public class IA : Interface<A> { }
public class IB : Interface<B> { }
public class Test
{
public void WhatTheFuck()
{
Interface<P> p;
p = new IA();// cast error here
p = new IB();// cast error here
//... somthing about interface<p>
}
out 키워드를 사용하여 제네릭 형식 매개 변수 공변을 선언 할 수 있습니다. 공변 유형은 다음 조건을 충족해야합니다.
형식은 인터페이스 메서드의 반환 형식으로 만 사용되며 메서드 인수 형식으로 사용되지 않습니다.
이 유형은 인터페이스 메서드에 대한 일반 제약 조건으로 사용되지 않습니다. 이것은 다음 코드에 설명되어 있습니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다