2009-12-09 3 views
1

은 예입니다. 왜 int를 반복해야합니까? int는 이미 D의 일부이기 때문에.닷넷 C#을 여기에 일반 문제

test1 메서드와 동일합니다. 나는 다음과 같이 쓰고 싶다 : A<D> t = new C();

어떻게 할 수 있습니까?

여기보다 현실적인 클래스 이름 UPDATE : 클래스 MyManager에서 온

public class MyModel<T> { } 
public class MyTrueModel : MyModel<int> { } 

public class MyManager<T,S> where T : MyModel<S> { } 
public class MyTrueManager : MyManager<MyTrueModel, int> { } 

public class Test1 
{ 
    public class test1 
    { 
     MyManager<MyTrueModel, int> t = new MyManager<MyTrueModel, int>(); 
    } 
} 

모든 문제. 만약 내가 뭔가를 할 수 있었다면 : MyManager<T> where T : MyModel 그것은 좋을 것이다.

답변

3

있는지 알아내는 문제가있을 수 있습니다 보이는데 같이하는 코드입니다 :

public class B<T> {} 
public class D : B<int> {} 
public class A<U, V> where U : B<V> {} 
public class C : A<D, int> {} 
public class Test1 { 
    public class test1 { 
     A<D, int> t = new C(); 
    } 
} 
: 여기

public class B<T> {} 
public class D : B<int> {} 
public class A<T, S> where T : B<S> {} 
public class C : A<D, int> {} 
public class Test1 { 
    public class test1 { 
     A<D, int> t = new C(); 
    } 
} 

은 해당 코드의

A<U, V>에있는 U은 더미입니다. UT (및 VS)으로 바꾸고 A<T, S>이라고 쓰면 TB<T>에 같은 T을 나타내지 않습니다. 따라서 C : A<D, int>을 사용해야합니다. A<D> 만 쓸 경우 컴파일러는 intTB<T>에 사용하려는 (언인스톨되지 않은 변수에 대한 아래 내 의견을 참조하십시오) 모릅니다.

모든 문제는 MyManager 클래스에서 발생합니다. 만약 내가 : MyManager<T> 같은 것을 할 수 있었다면 T : MyModel이 좋을 것입니다.

이것은 불가능합니다. MyModel이 (가) 유형으로 선언되지 않았습니다. MyModel<T> 만 유형입니다. 보다 구체적으로 말하면, 그것은 제한되지 않은 제네릭 형식입니다. 형식 인수 (예 : MyModel<int>)를 지정하면 구성된 형식이됩니다.

이 혼란 스러울 정도의 위험을 감수하면 더 이상 free and unbounded variables을 읽는 데 도움이 될 수 있습니다.

+0

오랫동안 답변 해 주셔서 감사합니다. 이해하는 데 도움이됩니다. 내가하고 싶은 일을 성취하기 위해 할 수있는 해결 방법이 있는지 아십니까? – Melursus

0

아마도 귀하의 질문에 대한 답을 찾지 못했습니다. 하지만 int가 필요하지 않으면.

public class A<T> where T : B<S> 

작업,하지만 난 내가 확실히 말할 수 없어에 컴파일러가없는해야 :로 그냥 D.

public class B<T> { } 
public class D : B<int> { } 
public class A<T> where T : D { } 
public class C : A<D> { } 
public class Test1 { public class test1 { A<D> t = new C(); } } 
-1

선언 A를 사용합니다.

+0

컴파일러가 S를 해결할 방법이 없다고 생각합니다. – itowlson

+0

T를 해결할 수있는 것처럼 쉽게 S를 해결할 수 있습니까? –

+0

@Anon. 아니요, 이것이 합법적이라면'A a = new A ();'그러나 이제'S '를 묶는 것은 무엇입니까? – jason

0

A<D> t = new C(); 이전에 A에 두 개의 일반 매개 변수가 필요하다고 선언했기 때문에 작동하지 않습니다.

당신은 같은 선언 할 수 있습니다 : 다음

class A2<T> : A<T, int> {} 

(나는 생각한다) ... 그것을 당신이 A2<D> t = new C();을 달성 할 수 있지만, 컴파일러는 A2가 C와 호환되는지 실현 똑똑 것을 나는 믿고있어 그렇지 않을 수도있다.

실험입니까? 당신이 지금부터 6 개월 어떻게해야 (또는 2개월 지금부터 :) 여기

+0

'A2 t2 = (A2 ) (A ) 새 C());는 위와 같이 정의 된 A2에서 작동하는 것으로 보이지만 확실히 좋지는 않습니다. P – Seth