2009-04-25 66 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和酒吧之间的物理距离,从而增加了认知读者的负担。