2015-01-24 3 views
1

내가 가지고있는 다음 코드 (이름은 예제 목적입니다) : 사전으로 나에게 데이터를 제공캐스트 : T3는 오류가 발생

일부 기능 :

public Dictionary<IMayor, SocialStatus> GetMayorSocialStatuses() 
{ 
    //Do Stuff 
} 

public Dictionary<IJanitor, SocialStatus> GetJanitorSocialStatuses() 
{ 
    //Do Stuff 
} 

그런 다음이 결과를 IPerson 유형의 사전에 추가하려고했습니다.

IJanitorIMayor은 모두 IPerson입니다. 나는 아무 문제가 없습니다 가정

는, 나는 다음을 수행하려고 노력 해요 :

public Dictionary<IPerson,SocialStatus> GetPersonsSocialStatuses() 
{ 
    var dict=new Dictionary<IPerson,S ocialStatus>(); 

    foreach(var mayorKvp in GetMayorSocialStatuses()) 
    { 
     dict.Add(mayorKvp.Key,mayorKvp.Value); 
    } 

    foreach(var janitorKvp in GetJanitorSocialStatuses()) 
    { 
     dict.add(janitorKvp.Key,janitorKvp.Value); 
    } 
} 

매력처럼 일하지만 foreach는이 digusting 보인다. 나는이 확장 방법으로 대체 시도

는 :

public static Dictionary<IPerson,SocialStatus> AddRange(
          this Dictionary<IPerson,SocialStatus> dict, 
          Dictionary<IPerson,SocialStatus> inputDict) 
{ 
    foreach(var kvp in inputDict) 
    { 
     dict.add(kvp.Key,kvp.Value); 
    } 

    return dict;; 
} 

있지만 이렇게하여

은, 내가 그것을 IPerson,SocialStatus에 유형 IMayor,SocialStatus의 사전에서 변환 할 수있는 컴파일 오류를 받았다.

문제를 조사한 후 상속이 사전에 따라 이동하지 않고 캐스트를 만들 수 없다는 의미의 "일반 제네릭 유형"이라는 방식으로 캐스팅 할 수 없다는 것을 깨달았습니다.

질문 : 어떻게하면 문제를 해결할 수 있습니까?

더 깨끗한 방법이 없습니까? (공급자가 같은 클래스에없는 경우/정적 클래스는, 내가 망했기 때문에)

그래서 모든 솔루션은 잘 될 것입니다 .NET의 특정 버전에 바인더 제본하고 있지 않다.

답변

3

컴파일러 오류가 옳습니다. 구체적인 유형의 사전 (한 유형의 키로 매개 변수화)을 다른 유형 (다른 유형의 다른 유형)에 할당 할 수 없습니다. 유형이 일치하지 않습니다 (언급 한대로). 가능한 해결책 중 하나는 확장 메서드 인수를 변경하여 IDictionary을 매개 변수로 사용할 수 있습니다. 불행히도 인터페이스가 매개 변수 invariant (convariance and contravariance)이기 때문에 도움이되지 않습니다.

가능한 해결 방법 :

public static Dictionary<IPerson, string> AddRange<TPerson>(
        this Dictionary<IPerson, string> dict, 
        Dictionary<TPerson, string> inputDict) 
    where TPerson : IPerson 
{ 
    foreach (var kvp in inputDict) 
    { 
     dict.Add(kvp.Key, kvp.Value); 
    } 

    return dict; 
} 
+0

멋진 대답! 매력처럼 작동합니다! – shirbr510