2009-04-25 65 views
1

我有一個通用的Print方法遍歷一個列表,並簡單地打印每個項目的文件名您在哪裏指定泛型類型?

private static void Print<T>(
     Func<IEnumerable<T>> getFiles, Func<T, string> getFileName) 
      where T : class 
    { 
     foreach (T file in getFiles()) 
     { 
      var fileName = getFileName(file); 
      Console.WriteLine("File Name: {0}", fileName); 
     } 
    } 

對於方法知道的T類型是我可以用兩種不同的方式

Print<FileInfo>(FileFinder.GetFiles, fileInfo => fileInfo.FullName); 
調用 Print

- 或 -

Print(FileFinder.GetFiles, (FileInfo fileInfo) => fileInfo.FullName); 

這將是一個正確方式請撥打Print方法?

顯式指定泛型還是讓編譯器推斷它?

+0

完成:繼續... – Sung 2009-04-25 19:21:38

回答

1

任何一個選項都可以。

我個人更喜歡允許編譯器在可能的情況下推斷出類型。在源代碼中沒有真正的需要,但IL中的最終結果是相同的。

+0

標記爲答案: Answer =>任一選項都可以,「IL,將會是相同的」=>支持答案的具體原因。 @ Reed:謝謝你的回答。 – Sung 2009-04-25 19:21:04

+0

歡迎您隨時隨地標記您喜歡的任何答案,但是當問題提出後不到30分鐘,人們對開放式問題的回答標記出來時,我總是感到很驚訝。誰知道在接下來的幾個小時內會出現多少優秀答案?爲什麼這麼快判斷? – Brian 2009-04-25 19:25:08

1

我傾向於喜歡第二個。通常,不能保證Print的通用參數與Func參數參數有任何合理的關係。這是給出

Foo<T>(yadda, (bar) => body) 

沒有理由認爲「T」和「酒吧」是相關的。而

Foo(yadda, (T bar) => body) 

你知道酒吧是一個T.另外,對於情況下,T和酒吧相關,如果yadda很長,你投入了大量的T和酒吧之間的物理距離,從而增加了認知讀者的負擔。