2014-11-19 1 views
0

다음 캐스트가 작동하지 않는 이유는 무엇입니까?.NET의 일반 형식 캐스트.

public void Add<T>() where T : MyInterface 
{ 
    var newObject = new Factory<T>() as Factory<MyInterface>; 

    ... 
} 

public class Factory<T> where T : MyInterface 
{ ... } 

newObjects는 항상 null로 유지됩니다.

+1

HTTP 당신이 캐스팅 할 수 이제

public interface IFactory<out T> {} public class Factory<T> : IFactory<T> {} 

.microsoft.com/en-us/library/dd233059.aspx –

+0

코드 냄새 : 왜 여기에 제네릭을 사용합니까? :/일반 또는 명시 적 ... –

답변

1

아마 Factory<T>이 (가) Factory<MyInterface>의 하위 유형이 아니므로 캐스트가 실패합니다.

Factory<T>는 불변stringobject에서 유래에도 Factory<object> 파생하지 Factory<string> 수단 (가정이 클래스이다)이다.

당신이 찾고있는 것은 공분산입니다. 불행히도 C#에서는 클래스가 변형 될 수는 없지만 인터페이스는 iiiif 일반 유형 매개 변수 T은 출력 (예 : 메소드의 반환 유형)으로 사용되며 절대로 입력 (예 : 메소드 매개 변수)으로 사용되지 않습니다.

당신 공장은 출력으로 T를 사용하는 경우, 당신은 같은에 대한 공변 inteface을 정의 할 수 있습니다 : // MSDN : IFactory<T>T:MyInterfaceIFactory<MyInterface>