2009-11-13 87 views
3

當我需要傳遞一個泛型類型,我可以使用語法C#推導泛型方法

(例如:Ofcourse它不是一個泛型方法)

public void Sample(T someValue) 
{ 
    ...... 
} 

什麼是宣佈Sample<T>的好處?

我的意思是

public void Sample<T> (T someValue) 
{ 
    ...... 
} 

回答

4

對於這項工作:

public void Sample(T someValue) 
{ 
    ...... 
} 

的類型T必須在系統中已經聲明。該方法將只接受T型或其衍生物。

通過聲明如下:

public void Sample<T> (T someValue) 
{ 
    ...... 
} 

你說的方法將接受來自任何類型。

+0

你的意思是類而不是系統? – jfar 2009-11-13 15:48:27

+0

不一定。可以在這個課程或其他地方聲明,只需要在這個地方知道。 – 2009-11-13 15:58:28

1

如果你的類不是泛型的,你可以使用第二個例子。這意味着你可以使這種方法通用。如果你的類是通用的,你應該使用你的第一個例子。

12

通用類型和通用方法是非常不同的東西。這聽起來像你有一個泛型類型:

class SomeType<T> { 
    public void Sample(T someValue) {...} 
} 

,並討論其裏面的一般方法:

class SomeType<T> { 
    public void Sample<T>(T someValue) {...} 
} 

這些都是非常不同。在第一個,Sample裏面,那麼T的意思是「T已經傳遞到SomeType<T>」。在第二個,Sample內部,這是一個獨立和獨立的T - 「T已被傳遞到Sample<T>」。實際上,稱它爲T(在這種情況下)是一個錯誤。你可以有,例如:

var obj = new SomeType<int>(); // here T for SomeType<T> is int 
obj.Sample<decimal>(123.45M); // here T for Sample<T> is decimal 

注意,有沒有簡單的方法(內Sample<T>)說:「在SomeType<T>T」的 - 因此你爲什麼要重命名方法的泛型類型參數。

有這種類型的情況下有效的方案(泛型類型的泛型方法),例如(注意:在新的名稱):

class SomeType<T> { 
    public void Sample<TActual>(TActual someValue) where TActual : T, new() {...} 
} 

這使得我們可以做一些很有趣的事情來講繼承等 - 或者您可能需要一個通用方法,該方法具有很少或沒有T的關係。這也沒關係。

4

考慮以下幾點:

class SomeClass<T> 
{ 
    public void Sample(T value) 
    { 
     // code goes here 
    } 
} 

或本:

class SomeClass 
{ 
    public void Sample<T>(T value) 
    { 
     // code goes here 
    } 
} 

在第一種情況下,在特定的情況下T的所有來電Sample將是相同的類型。在第二種情況下,特定實例中的每個調用都可以具有其自己的類型T,因爲泛型類型實參與方法調用一起提供。

第二種方法可以有很多用途,但一個,我是用我自己有時是在工廠方法:

public static class SomeFactory 
{ 
    public static T CreateSomeObject<T>() 
    { 
     T result = Activator.CreateInstance<T>(); 
     // perform any extra initialization 
     return result; 
    } 
}