2011-08-31 8 views
6

단위 테스트 프로젝트에서 도우미 메서드를 코딩하여 발표자 인스턴스를 초기화하고 발표자 상태를 설정합니다.형식 매개 변수는 형식 인수와 함께 사용할 수 없습니다.

그것은 나에게 예외를 던졌다 :

유형 매개 변수는 형식 인수를 사용할 수 없습니다

코드 : 분의 몇 내가 문제가 함께 있었다 발견

public static **TPresenter<TView>** Initialize<TPresenter,TView>() 
    where TPresenter: BasePresenter<TView>, new() 
    where TView : new() 
{ 
} 

내 반환 유형 TPresenter<Tview>

명확하게 설명하지 못한 게시물을 읽었습니다. 왜 말할 수 없습니까? T1<T2>

참조 매개 변수를 통해 발표자 지정을해야했습니다. 설명은 환영합니다! 당신이 TPresenter<TView> 메이크업 감각을하기 위해 할 수 있어야합니다 -

+3

'TPresenter'를 반환하지 않는 이유는 무엇입니까? 그것은''BasePresenter <>'를 통해''TView '를 전문화하는 유형으로 이미 제한되어 있습니다. –

+0

은 발신자 측에서 캐스트를 피하기 위해 희망적이었습니다! 내가 T1을 달성 할 수 있다고 가정하면 ! 처음에는 Presenter 반환 유형으로 정착 할 수 있었지만 실제로는 T1 이 어디에서 언급 되었는가와 함께 왜 시간 확인을 컴파일하는 데 도움이되는지 확신 할 수 없었습니다. – ioWint

답변

9

는 기본적으로 유형 매개 변수가 자체 형식 매개 변수의 특정 번호 제네릭 형식이라고 말하는 방법이 없습니다.

참조 매개 변수를 통해 작동하게하는 것이 무엇을 의미하는지 명확하지 않습니다. ref 매개 변수에 사용한 형식이 반환 유형으로도 적합해야합니다. 내 추측에 의하면 TPresenter 유형이 아니라 TPresenter<TView> 유형이었습니다.

+0

예. 빠져 나갔습니다. TPresenter – ioWint

+0

@ioWint : 맞습니다. –

+1

예, 발신자 측에서 명시 적 캐스트를 피하려고 생각했습니다. 지금까지 T1 으로 괴롭혀 본적이 없다. 이론적으로 모든 조건이 주어지면 좋겠다. – ioWint

1

TPresenter<TView>과 같은 것은 의미가 없습니다. TPresenter는 위치에 제약을받을 때까지 단지 자리 표시 자일뿐입니다. int<tview>이 없으므로 가질 수 없습니다. 제약 조건을 추가하면 BasePresenter<TView> 또는 일부 파생 형식이어야하므로 항상 Something<TView>이되므로 다시 TPresenter<TView>은 의미가 없습니다.

+0

나는 을 오도 할 수 있지만 TPresenter는 BasePresenter 이고 TInterface는 클래스라는 제약 조건을 지정합니다.이 일이 벌금 @ 컴파일 시간을 보장하기에 충분하지 않을까요? – ioWint

+1

요점은 제약 조건은 TPresenter가 BasePresenter 이거나 그로부터 파생 된 것이어야한다는 것을 말해 주므로 반환 유형이 TPresenter입니다. –

0

이것은 오래된 것입니다. 클래스 정의에서는 단일 유형을 사용하고 여러 유형을 사용합니다. 예 :

public class Template1<T>{} 

void SomeFunc() 
{ 
    <Template1<SomeClass1,SomeClass2>> someValue = new <Template1<SomeClass1,SomeClass2>>() 
} 

//or even: 
void SomeOtherFunc<U,V>() 
{ 
    <Template1<U,V>> someValue = new <Template1<U,V>>(); 
} 
0

내 코드에서 비슷한 오류가 발생했습니다. @Jon Skeet 올바르게 올바른 방향을 가리 킵니다. 반환 유형은 TPresenter : BasePresenter<TView>에 지정된대로 이미 일반 형식입니다. 따라서 TPresenter<TView> 대신 TPresenter으로 간단하게 사용할 수 있습니다.

public class BasePresenter<T> 
{ 

} 

public class Demo 
{ 
    public static TPresenter Initialize<TPresenter, TView>() where TPresenter: BasePresenter<TView>, new() 
    { 
     return null; 
    } 
} 
관련 문제