2013-10-29 2 views
-4

이것은 사용중인 코드이며 인스턴스화시 빌드 오류가 발생합니다. 이 T가 SpecialEntity로 설정 내 SpecialHandler 유형의 BaseHandler의 것을 표시되지 왜 나는왜 제네릭은 내 상속을 보지 못합니까?

규정이없는 한

(질문을 추론하는 내 심령 디버깅 기술을 사용하여)

static class HandlerFactory 
{ 
    public static BaseHandler<BaseEntity> Create(string typeString) 
    { 
     throw new NotImplementedException(); 
    } 

    public static BaseHandler<T> Create<T>(string typeString) where T : BaseEntity { 
     if (typeString == "Special") 
      **return new SpecialHandler();** //THERE'S BUILD ERROR HERE EVEN THOUGH Special Handler is inherits from type BaseHandler<T> 
     else 
      return null; 
    } 
} 

public class BaseHandler<T> where T : BaseEntity 
{ 
    public T GetEntity() 
    { 
     throw new NotImplementedException(); 
    } 
} 

public class SpecialHandler : BaseHandler<SpecialEntity> {} 

public class BaseEntity{} 

public class SpecialEntity : BaseEntity{} 
+7

문제의 설명과 질문의 의미를 설명해 주시겠습니까? – SWeko

+0

관찰하고있는 행동을 기술하십시오. – Gusdor

+2

위대한 순수 코드. 사람들이 코드를 올리라고 말하려한다면, 그 설명이 필요 없다는 것을 의미하지는 않습니다. – Tafari

답변

2

(그리고 그것은 단지 작동하는지 모르겠어요 on 인터페이스, 어쨌든), 유전자 매개 변수는 불변, 즉 정확한 것입니다.
List<Mammal>으로 정의 된 컬렉션은 어떤 식 으로든 List<Animal> 또는 List<Cat>으로 정의 된 컬렉션과 관련이 없습니다.

Create 방법은이 BaseHandler<BaseEntity> 아닌 BaseHandler<SpecialEntity> 반환하고 SpecialHandler는-A BaseHandler<SpecialEntity>하지만이 BaseHandler<BaseEntity> 아니라고 말한다.

+0

스펙타클 심령 디버깅 스킬 : –

+0

Thanks SWeko. 당신의 설명은 이해하기 쉬웠습니다 ... 그리고 당신은 좋은 심령 기술도 가지고 있습니다 :) –

관련 문제