我有一个通用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
Print<FileInfo>(FileFinder.GetFiles, fileInfo => fileInfo.FullName);
- 或 -
Print(FileFinder.GetFiles, (FileInfo fileInfo) => fileInfo.FullName);
调用Print
方法的正确方法是什么?
明确指定泛型类型还是让编译器推断它?
答案 0 :(得分:1)
两种选择都没问题。
我个人更喜欢允许编译器在可能的情况下推断出类型。没有必要在源代码中包含它,但最终结果(在IL中)将是相同的。
答案 1 :(得分:1)
我倾向于选择第二个。通常,不能保证Print的泛型参数与Func参数参数有任何合理的关系。这是
Foo<T>(yadda, (bar) => body)
没有理由认为“T”和“bar”是相关的。而
Foo(yadda, (T bar) => body)
你知道bar是T.另外,对于T和bar 相关的情况,如果yadda很长,你在T和bar之间放置了很多物理距离,这增加了认知读者的负担。