2013-07-30 3 views
0

과 제네릭 형식 캐스팅 I가 다음과 같은 클래스와 인터페이스인터페이스 제약

내가 IWrapper<IFoo>Wrapper<Foo> 캐스팅 수있는 방법
public interface IFoo {} 

public class Foo : IFoo {} 

public interface IWrapper<T> where T : IFoo {} 

public class Wrapper<Foo> : IWrapper<Foo> {} 

? 캐스트를 사용할 때 예외가 발생합니다 (InvalidCastException) as를 사용할 때 null이 반환됩니다.

도움 주셔서 감사합니다.

UPDATE 여기

더 구체적인 예는 다음과 같습니다

UserRepository up = new UserRepository(); 
IUserRepository<IUser> iup = up as IUserRepository<IUser>; 

내가 그물을 사용하고 있습니다 :

public interface IUser {} 

public class User : IUser {} 

public interface IUserRepository<T> where T : IUser {} 

public class UserRepository : IUserRepository<User> {} 

지금 나는 이런 식으로 뭔가를 할 수있을 필요가 4.5. 희망이 도움이됩니다.

+4

음, 당신은 할 수없는 - '래퍼 '하지 않습니다 'IWrapper '을 구현하십시오. 또한,'Woopper '의'Foo'가 실제로 새로운 타입 매개 변수라는 것을 알고 있습니까? 여기에 당신이 무엇을하려고하는지 명확히 알지 못합니다 ... –

+0

예, 질문을 기각해야하지만 래퍼 은 IWrapper를 구현합니다 . 그래도 래퍼에서 IWrapper 을 가져 오는 방법을 모른다. . – Hernan

+0

좋아요, 우리는 여전히 더 많은 정보가 필요합니다 : a) 어떤 버전의 C#을 사용하고 있습니까? b)'IWrapper '에서'T'가 어떻게 사용됩니까? (여기에 일반적인 변이를 사용할 수는 있지만 아직 알지는 못합니다.)'Wrapper '의'Foo'는 * 여전히 * 유형 매개 변수입니다 - Wrapper : IWrapper '을 * Wrapper 의 인스턴스 *? 완전한 예제가 도움이 될 것입니다. –

답변

4

, 당신은 실제로 원하는 :

다음
public interface IUserRepository<out T> where T : IUser {} 
public class UserRepository : IUserRepository<User> {} 

당신이 할 수 있습니다 만 추가 할 수 있습니다

IUserRepository<IUser> iup = new UserRepository(); 

참고이 경우 형식 매개 변수 Tout 수정자를 추가 IUserRepository의 정의에서 어디에서나 출력 위치에 나타납니다. 이 같은이 컴파일에 실패하는 방법 매개 변수 또는 속성 setter로, 입력 위치에 어디서나 나타나는 경우

public interface IUserRepository<out T> where T : IUser 
{ 
    List<T> GetAll(); 
    T FindById(int userId); 
} 

:

public interface IUserRepository<out T> where T : IUser 
{ 
    void Add(T user);  //fails to compile 
} 
+1

기술적으로 당신의 대답은 정확하지만 나는'IUserRepository'가 공역 적이 될 수 있습니다 - 업데이트/삭제). –

+0

@DStanley - 업데이트를 참조하십시오. 이것이 충분하지 않은 경우 OP는 더 많은 정보를 추가해야합니다. – Lee

+0

우수! 대답은 나를 올바른 방향으로 가리켰다. 밖으로 핵심이 무엇을위한 것인지 분명하지 않았습니다. 나는 지금 그것을 얻기 시작하고있다. 감사! – Hernan

0

Wrapper<Foo>Wrapper<IFoo>이어야합니다. 그렇다면 그것을 캐스팅 할 수 있어야합니다. 그리고 인터페이스도 구현해야합니다.

아래 캐스트가 작동합니다 ... 개체 유형 매개 변수를 다른 유형 (예 : IWrapper<Foo>에서 IWrapper<IFoo>)으로 캐스팅 할 수 있다고 생각하지 않습니다. 당신의 편집에서

void Main() 
{ 
    var foo = new Wrapper(); 
    var t = foo as IWrapper<IFoo>; 
    t.Dump();  
} 


public interface IFoo {} 

public class Foo : IFoo {} 

public interface IWrapper<T> where T : IFoo {} 

public class Wrapper : IWrapper<IFoo> {} 
+0

예, 질문을 기각해야하지만 래퍼 은 IWrapper 을 구현했습니다. 그래도 IWrapper를 가져 오는 방법을 모르겠다 랩 어 Hernan

+0

왜 'as'를 사용합니까? 컴파일러는 캐스트를 컴파일 타임보다는 런타임으로 강등합니다. 직접적인 할당은 더 안전 할 것이고 컴파일러가 컴파일 타임에 작동하지 않을 것이라고 컴파일러가 알릴 수 있습니다 ... – binki

관련 문제