你在哪里指定泛型类型?

时间:2009-04-25 18:59:20

标签: c# generics

我有一个通用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方法的正确方法是什么?

明确指定泛型类型还是让编译器推断它?

2 个答案:

答案 0 :(得分:1)

两种选择都没问题。

我个人更喜欢允许编译器在可能的情况下推断出类型。没有必要在源代码中包含它,但最终结果(在I​​L中)将是相同的。

答案 1 :(得分:1)

我倾向于选择第二个。通常,不能保证Print的泛型参数与Func参数参数有任何合理的关系。这是

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

没有理由认为“T”和“bar”是相关的。而

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

你知道bar是T.另外,对于T和bar 相关的情况,如果yadda很长,你在T和bar之间放置了很多物理距离,这增加了认知读者的负担。