[英]C# Generic Method Without Specifying Type
好吧,我是一個開始使用C#的Java人員,我正在編寫並開始制作一個通用方法,我編寫的運行和編譯,但它違背了我所知道的關於泛型應該如何工作的一切,所以我希望有人可以解釋這個對我來說:
所以我有一個通用的方法定義如下:
public static List<T> CopyAsList<T>(IEnumerable<T> list, Object lockObject)
{
if (list != null)
{
lock (lockObject)
{
return new List<T>(list);
}
}
return null;
}
但對我來說奇怪的是,我可以在不指定T
情況下調用此泛型方法,它將起作用:
List<String> strings = new List<string>() { "a", "b", "c"};
List<int> ints = new List<int>() { 1,2,3};
object lockObject = new object();
foreach (string s in CopyAsList(strings, lockObject))
{
Console.WriteLine(s);
}
foreach (int i in CopyAsList(ints, lockObject))
{
Console.WriteLine(i);
}
如何在沒有指定泛型類型的情況下編譯代碼? C#是否在運行時推斷出類型?
不,它是在編譯時推斷的 - 使用了您提供的IEnumerable<T>
的泛型類型參數,這在編譯時是已知的。 通常,在編譯時指定有關泛型和類型參數的所有內容 。 如果存在任何類型的不匹配,編譯器將抱怨並且您的代碼將無法編譯。
有些邊緣情況需要明確指定類型,這些僅在極少數情況下使用重載方法,有時會出現多種類型參數組合。
與Java相比,C#具有更多的編譯時和運行時類型推斷功能。 如果此主題感興趣,請參閱我關於此主題的文章:
http://blogs.msdn.com/b/ericlippert/archive/tags/type+inference/
如果您對泛型方法類型推斷特別感興趣,並且您有半小時的空閑時間,請在此解釋我們如何更改C#3中的類型推斷算法:
http://blogs.msdn.com/b/ericlippert/archive/2006/11/17/a-face-made-for-email-part-three.aspx
C#編譯器通常可以在編譯時推斷泛型類型。 當它可以執行此操作時,您不需要指定泛型方法的類型。
這是使LINQ“可用”的主要部分。 如果沒有編譯時類型推斷,查詢將如下所示:
IEnumerable<int> myIds = myCollection
.Where<MyType>(i => i.Name == "Foo")
.Select<MyType, int>(i => i.Id);
而不是寫:
var myIds = myCollection.Where(i => i.Name == "Foo").Select(i => i.Id);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.