2012-10-12 4 views
2

가 여기 내 예를 인터페이스로 캐스팅 할 수 없습니다)인터페이스

이제 내가하려는 것은 인터페이스입니다. 내 보관 방법. 내가 저장소 방법으로 그것을 전달하는 시도하십시오

var job = new ImageJob<ImageStep, ImageDelivery> 
{ 
    ... 
} 

그리고 :

public void CreateJob(IJob<IStep, IDelivery> job); 

그래서 나는 새를 만듭니다의 예를 들어이 방법을 보자

repository.CreateJob(job); 

그리고 나는를 얻을 수 오류 :

Unable to cast ImageJob<ImageStep, ImageDeliver> to type IJob<IStep, Idelivery> 

Can 누군가 이것이 왜 오류를 던지고 있는지 설명해 주시겠습니까? 완전히 잘못 구현하고 인터페이스합니까?

내가하려는 일에 대한 해결책이 있습니까? 나는 등 다른 단계배달 방법, 각 작업에서 추상적 원하는

이 가능한 다른 방법이 있나요? 아니면 전적으로 뭔가를 놓치고 있습니까?

+0

+1 공분산이 너무 까다 롭습니다. –

답변

4

공변량을 사용할 수 있다고 생각합니다.

MyType<object> list = new MyType<MyType>; 

클래스 및 인터페이스 decleration가 :

public interface IMyType<out T>{...} 
public class MyType<T> : IMyType<T> {...} 

일반 decleration의 "밖으로"키워드가 수 이것은 같은 자사의 일반 인터페이스 또는 기본 클래스 중 하나에 특정 제네릭 형식을 캐스팅 할 수 있습니다 캐스트.

Here

당신이 인터페이스에서 세터를 그물로하지 않는 경우가 더

귀하의 경우는 (것이 도움이 될 수 MSDN에 좋은 페이지입니다

public interface IJob<out T, out R> 
    where T : IStep 
    where R : IDelivery 
{ 
    T Step { get; } 
    R Delivery { get; } 
} 

이 함께 작동합니다 귀하의 구현 클래스

+0

getter와 setter가 모두 필요하면 중간 얼굴, 당신은 그런 구현과 같은 인터페이스를 만들 수 없습니다. 이유를 보려면, 캐스트 한 후에'myObj.Step = new OtherStep()'을 설정하려고하면,'myObj'가'T'의' ImageStep'. –

+0

그 트릭을 했어! 솔루션 C#을 사용해 주셔서 감사합니다. – ehftwelve

+0

@ehftwelve 내가 도울 수있어서 기쁩니다. 감사합니다 :-) 감사합니다! – oberfreak

2

나는 IJob의 선언이

public interface IJob<T, R> 
    where T : IStep 
    where R : IDelivery 
{ 
    T Step { get; set; } 
    R Delivery { get; set; } 
} 

이 그렇지 않으면 TR 매개 변수는 인터페이스에서 사용되지 않습니다 및 IJob 효과적으로 비 제네릭 할 필요가 생각합니다. 그 외에도 명확성을 위해 유형 매개 변수의 이름을 TStepTDelivery으로 지정할 수 있습니다.

+0

죄송합니다. 사실 그것이 어떻게됩니까? 위의 코드를 변경합니다. – ehftwelve