차이

2012-03-19 5 views
2

어떤 차이 선언 사이에있다 :차이

GenericClass<T> genericInst = new GenericClass<T>(); 

하고 여기에

GenericClass<baseClass> temp = new GenericClass<baseClass>(); 

가 GenericClass이 where T : baseClass

GenericClass에 대한 정의된다는 일반적인 포함되어 있습니다 목록

private List<T> vals = new List<T>(); 
+0

위의 문맥에서 T를 어떤 문맥에서 사용하고 있습니까? –

답변

1

만약 내가 틀렸다면, 당신이 '012 : T : baseClass'를 T의 기본값 인 것처럼 baseClass 인 것처럼 받아 들일 것입니다. 그래서,이 경우가 아니라면

, 전문화 where T : baseClass는 유형이 TbaseClass 또는 baseClass로부터 유도 될 (또는 대신 클래스 인터페이스 구현된다면)해야한다는 것을 의미한다. 당신이 있다면

따라서, :

public class GenericClass<T> where T : baseClass 
{ 
} 

을 다음 당신은 말할 수 :

var x = new GenericClass<baseClass>(); 

또는

var y = new GenericClass<SomethignDerivedFromBaseClass>(); 

그러나 당신이 말할 수 :

var z = new GenericClass<int>(); 

intbaseClass을 상속하지 않으므로 실제로 GenericClass<T> 내에서 코드 줄을 호출 한 경우

실제로 위의 인스턴스에 T를 사용하는 유일한 방법은 다음과 같습니다

public GenericClass<T> where T : baseClass 
{ 
    void SomeMethod() 
    { 
     GenericClass<T> genericInst = new GenericClass<T>(); 
    } 
} 

또는 T는 이미 서브 것으로 알려져 또 다른 맥락에서

baseClass의 클래스. 당신이 궁금처럼

UPDATE 귀하의 의견을 바탕으로

들린다 당신이 가지고있는 경우 :

public class GenericClass<T> where T : baseClass 
{ 
    public List<T> Items { get; set; } 

    ... 
} 
당신이 목록에없는 baseclass에서 파생 된 일을 추가 할 수 있는지 여부

과 대답 네 ~입니다. baseClass로부터 상속받은 T에 대해 GenericClass<T> 클래스를 선언 할 수 있습니다. 그러나 List<T>은 여전히 ​​유형이 T 인 강하게 입력됩니다. 이 주어집니다

는 :

public class BaseClass { } 
public class SubClass : BaseClass { } 

GenericClass<BaseClass>List<T>T 이후는 BaseClass 될 것입니다 모두 BaseClassSubClass에서 개최 할 수있다.

그러나 GenericClass<SubClass>List<T> 어디 TSubClass의 항목을 보유하거나 상속 할 수 따라서 SubClass있을 것이다 것입니다.

+0

종류입니다. baseclass 매개 변수를 사용하여 선언하면 혼란이 생길 ​​수 있습니다. 캐스팅하여이 파생 된 유형을 파생 클래스에 포함 할 수 없습니까? – gwizardry

+0

목록 은 모든 T '가 T이기 때문에 캐스팅하지 않고 T에서 파생 된 유형의 항목을 보유 할 수 있습니다. 즉, 목록 은 직사각형, 원 및 사각형을 포함 할 수 있습니다. 즉, 목록 은 목록 으로 직접 캐스팅 할 수 없거나 문제가 될 수 있습니다. –

+0

나는 상속 사슬을 캐스팅하는 것을 오해 한 것 같습니다. 목록 이 사각형을 저장할 수있는 이유는 무엇입니까? – gwizardry