2009-05-05 63 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); 

正如Scott指出,你可以使用相同的命名參數。雖然這樣做會引起警告,並且通常會引起混淆。對於目前在範圍內的所有通用參數具有不同的名稱會更清晰。

+2

如果你看看方法,「T」實際上是一個方法參數。它與該類的參數具有相同的名稱,因此會生成警告。但是,這裏並不是非法的。 (雖然我會建議將它重命名爲U,就像你建議的那樣) – 2009-05-05 22:54:52

+0

@Scott,我實際上認爲C#會在那裏發出一個錯誤而不是警告。奇怪的 :( – JaredPar 2009-05-05 22:59:00

0

你會想要單獨聲明的方法類型變量的類 -

class Test<T> where T : class { 

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

} 
+0

我實際上並沒有試圖做任何事情。我今天必須參加C#考試,並提出了與我所建議的非常相似的問題/代碼。我不確定答案,所以我想我會在這裏問。不幸的是,我完全不記得代碼。 – dotnetdev 2009-05-05 22:51:50