为什么.NET方法有时会返回常规类型,而不是使用泛型和类型约束

本文关键字:类型 泛型 约束 方法 返回 为什么 常规 NET | 更新日期: 2023-09-27 18:35:03

例如

,考虑以下方法:

public static Attribute GetCustomAttribute(this ParameterInfo element, Type attributeType);

System.Reflection.CustomAttributeExtensions中定义

定义不是更有意义吗:

public static T GetCustomAttribute<T>(this ParameterInfo element, T attributeType) where T : Attribute;

并保存选角?

为什么.NET方法有时会返回常规类型,而不是使用泛型和类型约束

检索自定义属性的非泛型方法来自未实现泛型的旧 .NET 时代。

对于当前和将来的编码,可以利用CustomAttributeExtensions.GetCustomAttributes<T> - 如果使用 .NET 4.5 及更高版本进行编码 - 。

可悲的是 - 或者实际上 - 软件有一个连续的演变。我的意思是,曾经有一段时间我们没有泛型(.NET 1.0 和 1.1(,并且有很多代码库是从早期的 .NET 版本继承的,并且由于框架团队的优先级,似乎并不是每个使用泛型参数更好的方法都已经实现。

关于继承的代码

@BenRobinson在这里的一些评论中说:

我要说的是,这些扩展方法被添加到 .NET 4.5(所有这些不仅仅是通用的(和扩展方法 在泛型之后添加,因此任何类型的非泛型扩展方法 与 .NET 1.0/1.1 的向后兼容性无关。

我添加这个是为了避免混淆:由于与第三方代码的向后兼容性,Microsoft不更改非通用代码库,因此不理解继承的代码

实际上,我指出当前的 .NET 版本本身有很多从早期 .NET 版本继承的代码,如果Microsoft的目的是保持与第三方代码的向后兼容性。

我假设或猜测.NET Framework Team已经优先考虑了新的基类库(BCL(和卫星框架的添加,一些来自前泛型时代的成员仍然保持原样,因为更改不值得付出努力,或者我们可以讨论是否值得付出努力,他们确实设计了决策错误,但StackOverflow不是一个讨论板, 是吗?

确实有一个等效于您的示例的重载,GetCustomAttribute<T>(ParameterInfo) ,但是要调用此方法而不进行讨厌的反射,您需要在编译时知道 T 的类型。如果您只知道运行时 T 的类型,则等效方法是GetCustomAttribute(ParameterInfo, Type)

型在版本 2 中添加到 C# 语言中。我相信属性在版本 1 或 1.1 的语言中(不记得哪个,我认为它在版本 1 中,但我可能是错的(。

这意味着,即使它们可以通过将所有方法更改为使用泛型来节省大量不必要的转换,但它们也可能破坏向后兼容性。打破向后兼容性是不好的™。

编辑:

另外,我只是想到了一个原因。如果你正在编写反射代码,通过反射调用泛型方法通常很麻烦(C# 有一个非常愚蠢的 api 来这样做......(,所以如果你正在编写反射代码,那么在许多情况下使用非泛型版本比使用泛型版本要容易得多。

再次编辑:

该死的,本·鲁滨逊把我打到了反射点一分钟! :)