簡體   English   中英

沒有指定類型的C#通用方法

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM