gpt4 book ai didi

c# - 扩展方法和源代码的向前兼容性

转载 作者:太空狗 更新时间:2023-10-30 00:36:15 25 4
gpt4 key购买 nike

我想解决在未来开发中使用扩展方法和类接口(interface)放大的问题(现在是假设的,但将来可能是真实的)。

例子:

/* the code written in 17. March 2010 */
public class MySpecialList : IList<MySpecialClass> {
// ... implementation
}
// ... somewhere elsewhere ...
MySpecialList list = GetMySpecialList(); // returns list of special classes
var reversedList = list.Reverse().ToList(); // .Reverse() is extension method
/* now the "list" is unchanged and "reveresedList" has same items in reversed order */

/* --- in future the interface of MySpecialList will be changed because of reason XYZ*/

/* the code written in some future */
public class MySpecialList : IList<MySpecialClass> {
// ... implementation
public MySpecialList Reverse() {
// reverse order of items in this collection
return this;
}
}
// ... somewhere elsewhere ...
MySpecialList list = GetMySpecialList(); // returns list of special classes
var reversedList = list.Reverse().ToList(); // .Reverse() was extension method but now is instance method and do something else !
/* now the "list" is reversed order of items and "reveresedList" has same items lake in "list" */

我的问题是:有什么方法可以防止这种情况发生(我没找到)?如果现在是如何预防它的方法,是否有某种方法可以找到像这样的可能问题?如果现在是如何找到可能的问题,我是否应该禁止使用扩展方法?

谢谢。

编辑:

您的回答很有用。我可以找到代码中使用扩展方法的地方吗?和/或我能否找到代码中使用实例方法但存在具有相同签名的扩展方法的地方?

最佳答案

你描述的好像是下面这种情况

  1. 在您的产品 MySpecialList 的 V1 中没有 Reverse 方法,因此所有对 Reverse 的调用都绑定(bind)到同名的扩展方法<
  2. 在您的产品 V2 中,MySpecialList 获得了一个 Reverse 方法,现在所有以前绑定(bind)到扩展方法的绑定(bind)都改为绑定(bind)到实例方法。

如果您想在实例/扩展方法表单中调用 Reverse,则无法阻止这种情况,因为这是设计好的行为。如果实例方法至少与扩展方法版本一样好,那么实例方法将始终优先于扩展方法。

100% 防止这种情况的唯一方法是将扩展方法作为静态方法调用。例如

ExtensionMethods.Reverse(list);

新版本产品绑定(bind)新方法的问题不仅限于扩展方法(尽管问题可能更糟)。您可以对类型做很多事情来改变方法绑定(bind)的影响方式,例如实现新接口(interface)、继承或添加新转换

关于c# - 扩展方法和源代码的向前兼容性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2463933/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com