2009-05-05 9 views
1
class test <T> where T : class 
{ 
    public void Write<T>() 
    { 
     Console.Write(typeof(T).FullName); 
    } 
} 

위의 클래스에서 클래스 (test<string> Test = new test<string>)의 문자열을 전달하고 메서드에 int를 전달할 수 있습니까? 그렇다면 결과는 무엇입니까? 그렇지 않은 경우 어떤 문제가 발생합니까? 제네릭 (제 클래스에서)과 제네릭 컬렉션을 자주 사용 했음에도 불구하고 실제로 이것을 시도하지 않았습니다. 다음과 같이제네릭 클래스 및 제네릭 메서드

나는 일반적인 클래스를 참조/쓰기 방법은 다음과 같습니다

class <T> where T : class 
{ 
    public T Write() 
    { 
     Console.Write(T.ToString()); 
    } 
} 

답변

3

그것으로 원래 쓰여진 것이 아니 었습니다. 클래스의 다른 지점에서 다른 유형을 사용하려면 여러 일반 매개 변수가 있어야합니다. 이 방법의 수준에서 다른 하나를 정의하고 스콧이 같은 명명 된 매개 변수를 사용할 수 있습니다 지적 샘플이

class Test<T> where T : class { 
    public void Write<U>(U arg1) { 
    Console.WriteLine(arg1.ToString()); 
    } 
} 

사용

var t = new Test<string>(); 
t.Write(42); 

에게 일을 얻을 수 있습니다. 그렇게하면 경고가 나오고 일반적으로 사람들을 혼란스럽게합니다. 현재 범위 내에있는 모든 일반 매개 변수에 대해 고유 한 이름을 갖는 것이 훨씬 더 명확합니다.

+2

메서드를 보면 "T"는 실제로 메서드 매개 변수입니다. 클래스의 매개 변수와 이름이 같으므로 경고가 생성됩니다. 그러나 실제로는 불법이 아닙니다. (나는 당신이 제안한 것처럼 U로 이름을 바꾸는 것이 좋습니다.) –

+0

@Scott, 나는 실제로 C#에서 경고와 경고를 비교할 것이라고 생각했습니다. 이상한 :( – JaredPar

0

당신은 클래스에 별도로 방법의 유형 변수를 선언하고자 할 것이다 -

class Test<T> where T : class { 

    public void Method<U>(U val) { 
     Console.WriteLine(typeof(U).FullName); 
    } 

} 
+0

저는 실제로 아무 것도하려고하지 않았습니다. 오늘 C# 시험을 치러야 만했고, 내가 제안한 것과 매우 비슷한 질문/코드를 생각해 냈습니다. 나는 내가 여기서 물을 것이라고 생각했기 때문에 대답을 확신하지 못했습니다. 불행히도 코드를 그대로 기억할 수는 없습니다. – dotnetdev