2012-07-19 4 views
0

다음과 같은 구조가 있습니다. 제네릭 컬렉션을 반환하는 데 문제가 있습니다. 내가 뭘 놓치고 있니? 예일반적인 유형의 캐스팅 C#

businesscollection is a GenericCollection<BusinessEntity>

,하지만 당신은 유형 Businesscollection로 선언

class Program 
{ 
    static void Main() 
    { 
      BusinessCollection businessCollection = new BusinessCollection(); 

      //Why this is not working because businesscollection is a GenericCollection<BusinessEntity> 
      businessCollection = new GenericCollection<BusinessEntity>(); 

      //or neither this 
     businessCollection = (BusinessCollection)new GenericCollection<BusinessEntity>(); 
    } 
} 



public class BusinessEntity 
{ 
    public string Foo { get; set;} 
} 

public class BusinessCollection : GenericCollection<BusinessEntity> 
{ 
    //some implementation here 
} 

public class GenericCollection<T> : ICollection<T> 
{ 
    //some implementation here 
} 

답변

5

원하는 작업을 수행 할 수 없습니다. 다른 방법으로도 사용할 수 있습니다.

모든 BusinessCollection은 참으로 GenericCollection<BusinessEntity>하지만 모든 GenericCollection<BusinessEntity>BusinessCollection

그래서 다음이 작동 것을 확실히 말할 수 없습니다.

class Program 
{ 
    static void Main() 
    { 
      GenericCollection<BusinessEntity> businessCollection = new BusinessCollection(); 
      //this will work 
      BusinessCollection tempCollection = (BusinessCollection)businessCollection ; 
    } 
} 



public class BusinessEntity 
{ 
    public string Foo { get; set;} 
} 

public class BusinessCollection : GenericCollection<BusinessEntity> 
{ 
    //some implementation here 
} 

public class GenericCollection<T> : ICollection<T> 
{ 
    //some implementation here 
} 
2

은 당신의 가정을 확인합니다. 모두 GenericCollection<BusinessEntity>BusinessCollection인데 그게 BusinessCollection에 할당하려는 것입니다.

2

사각형은 사각형이지만 모든 사각형이 사각형이 아니므로 사각형입니다. 이 경우 BusinessCollectionGenericCollection<BusinessEntity>이지만 모두 GenericCollection<BusinessEntity> 개체가 BusinessCollection 개체는 아닙니다. BusinessCollection으로 입력 된 변수는 GenericCollection<BusinessEntity> 오브젝트를 가리킬 수 있지만 그 반대의 오브젝트는 가리킬 수 없습니다.

2

businessCollectionsBusinessCollection으로, 에만 이 할당되고BusinessCollection이 될 수 있습니다. 그러나 GenericCollection<BusinessEntity>() a BusinessCollection이 아닙니다. 마찬가지로 "동물"은 "개"가 아닙니다 (그러나 "개"는 "동물"입니다).

런타임 또는 컴파일 타임에 유효성을 검사 할 수 있습니다. 우리가 실제로 을 고려하고있는 특정 동물이 개인지 여부를 확인

이는 "동물을"사용
businessCollection = (BusinessCollection){some expression}; 

수 있습니다 "개"테스트, 예 : 런타임 - 옵션은 캐스트입니다 . 이 검사는 런타임까지 지연됩니다. 그래서이 라인 을 컴파일하지만 실제로는 이 아닙니다. 특정 동물 절대 실제로 개입니다.