2011-11-02 2 views
0

나는 다음과 같은 방법을 시도하고, 그러나 그것은 나에게 컴파일러 오류 제공 :상속 된 generic을 변환 할 수 없습니까?

public class MyManager<T> : where T:MyEventArgs 
{ 
    private Dictionary<EventHandler<T>, EventFilter<T>> m_cSubscriptions; 

    public void Subscribe<K>(EventHandler<K> _cHandler, EventFilter<K> _cFilter) 
    where K:T 
    { 
     try 
     { 
      // cannot convert EventHandler<K> to EventHandler<T> 
      m_cSubscriptions.Add(_cHandler, _cFilter); 
     } 
     catch (ArgumentException) 
     { 
      m_cSubscriptions[_cHandler] = _cFilter; 
     } 
    } 
} 

질문 : 왜 T와 K에서 핸들러를 변환 할 수 없습니다?

Unity3D를 사용하고 있기 때문에 .net 2.0을 사용하고 있습니다. 나는 그것을 직접 던져야 하나? 나는 공분산과 반항에 관해 읽었지 만, 나는이 것을 이해할 수 없었다.

+0

.Net 2에서 지원하지 않는 공분산을 사용하려고합니다. – SLaks

답변

0

Delegate을 사용하고 제네릭없이 일반 EventFilter 클래스를 정의하여 사전을 더 일반적인 것으로 변경하기로 결정했습니다. 나는 아직 이것을 시험하지 않았기 때문에 주조가 정확할 것으로 희망한다. 나는 그것이 효과가 있기를 바랍니다.

public class MyManager<T> : where T:MyEventArgs 
{ 
    private Dictionary<Delegate, EventFilter> m_cSubscriptions; 

    public void Subscribe<K>(EventHandler<K> _cHandler, EventFilter<K> _cFilter) 
    where K:T 
    { 
     try 
     { 
      // cannot convert EventHandler<K> to EventHandler<T> 
      m_cSubscriptions.Add(_cHandler, _cFilter); 
     } 
     catch (ArgumentException) 
     { 
      m_cSubscriptions[_cHandler] = _cFilter; 
     } 
    } 
} 
0

EventHandler<Derived>은 no EventHandler<Base>입니다. 입력 매개 변수는 반대 변형입니다. 그래서 당신의 코드는 C# 4/.net 4에서도 작동하지 않을 것입니다.

당신은 래퍼를 만들어이 문제를 해결할 수는 (이 예에서는 C# 3와 함께 작동하지만, 비슷한 코드는 C# 2 가능합니다) :

(s,e) => handler(s, (K)e) 

그러나이 캐스트 정적 유형의 안전을 잃을 .

안전한 방향으로 대리인을 변환하려면 ConvertDelegate<T> 메서드를 사용할 수 있습니다.

+0

그러나 이미'K : T'를 확인했다면 안전하게 캐스팅 할 수 있습니다. 맞습니까? – Marnix

+0

@ 마르 니스 안전하게 캐스팅하려면 'K : T'가 아닌'T : K'를 확인해야합니다. 내가 말했듯이'in' 매개 변수는 반 차별입니다. – CodesInChaos

+0

아 사실. 'EventFilter '을'EventFilter '로 변환 할 수 없으므로 ConvertDelegate 메소드가 완전하게 작동하지 않습니다. 그리고'EventFilter'는 단순한 클래스입니다. 기본 목록에서 이러한 일반 객체를 가져 오는 더 좋은 방법은 무엇입니까? 인터페이스에서 뭔가를 찾았습니까? : http://www.fotia.co.uk/fotia/DN.01.CoVariantGenericList.aspx – Marnix

관련 문제