2014-04-25 2 views
1

왜 내가 T로 캐스팅해야하는지, 왜 Add2가 Bar를 매개 변수로 받아들이지 않는지 설명 할 수 있습니까?왜 유형 매개 변수로 형변환해야하며 제한 유형을 사용할 수 없습니까?

class Foo<T> where T : class, IBar 
{ 
    void Add1(IDo<T> @do) { @do.Stuff(new Bar() as T); } 

    // Add2 does not compile: 
    // Argument type Bar is not assignable to parameter Type T 
    void Add2(IDo<T> @do) { @do.Stuff(new Bar()); } 
} 

interface IBar {} 

class Bar : IBar {} 

interface IDo<in T> { 
    void Stuff(T bar); 
} 

답변

6

적절하지 않을 수도 있습니다. 예를 들어, 고려 : IDo<Other>.Stuff 요구하는 BarOther 아니므로 분명히 잘못된 do.Add2(new Bar())를 호출하는 것입니다 현재 코드, ...,와

class Other : Bar {} 

... 

IDo<Other> do = new DoImpl<Other>(); 
Foo<Other> foo = new Foo<Other>(); 
foo.Add2(do); 

합니다.

T에 주조 (또는 as를 사용)는 중 적합하지 않습니다 - 당신은 new Bar()Other에 캐스팅 할 수 없으며, 당신이 사용하는 경우 as 당신은 null 참조를 얻을 수 있습니다.

+0

'Add2'는'IBar' 또는 그 서브 클래스 중 하나를 받아들이지 않습니다. 'IDo '매개 변수를 지정해야합니다. – mrt181

+0

@ mrt181 : 예, 죄송합니다 - 마지막 호출은'foo.Add2 (do); '였습니다. 지금 고쳐졌고 - 잘하면 이것이 무엇이 잘못되었는지를 보여줍니다. –

관련 문제