C#:当我们没有指定泛型时,为什么泛型不能使用最通用的类​​型?

时间:2009-07-03 12:56:30

标签: c# generics

例如我现在创建了一个小小的类:

public static class FileSystemInfoComparers<T> where T : FileSystemInfo
{
    public static IEqualityComparer<T> FullName
    {
        get { return new FullNameComparer(); }
    }

    private class FullNameComparer : IEqualityComparer<T>
    {
        public bool Equals(T x, T y)  { return x.FullName == y.FullName;   }
        public int GetHashCode(T obj) { return obj.FullName.GetHashCode(); }
    }
}

如果我能做的话,我想要它

var comparer = FileSystemInfoComparers.FullName;

并且有一个IEqualityComparer<FileSystemInfo>的实例,因为我没有指定任何类型,而FileSystemInfo是T最通用的类​​型。如果没有类型约束,则默认类型可以是对象或其他类型。

也许不是最好的例子,但无论如何只是在这里好奇:p

3 个答案:

答案 0 :(得分:10)

听起来像是给我带来麻烦的食谱。

特别是,您可以轻松创建一个名为FileSystemInfoComparers的非泛型类,其中包含相同名称的静态属性,突然您的代码意味着完全不同。

我宁愿保持简单。 (泛型已经足够复杂,特别是类型推断非常多毛。)

答案 1 :(得分:1)

这是一个有趣的想法,它肯定可行,但认为它只适用于泛型类型参数受具体类型约束的情况。

.NET编译器非常擅长类型推断,但往往不愿做出任何假设。我没有看到为什么不能做到这一点,除了它只能在少数高度特定的实例中工作。由于它没有一般的目的,我认为微软不太愿意做出改变来支持它。

答案 2 :(得分:0)

您可以通过拥有一个具有您想要设置的默认类型的帮助程序类来实现此目的。但是你目前要求的东西不能在C#3.0中完成。