- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我想解决在未来开发中使用扩展方法和类接口(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" */
我的问题是:有什么方法可以防止这种情况发生(我没找到)?如果现在是如何预防它的方法,是否有某种方法可以找到像这样的可能问题?如果现在是如何找到可能的问题,我是否应该禁止使用扩展方法?
谢谢。
编辑:
您的回答很有用。我可以找到代码中使用扩展方法的地方吗?和/或我能否找到代码中使用实例方法但存在具有相同签名的扩展方法的地方?
最佳答案
你描述的好像是下面这种情况
MySpecialList
的 V1 中没有 Reverse
方法,因此所有对 Reverse
的调用都绑定(bind)到同名的扩展方法<MySpecialList
获得了一个 Reverse
方法,现在所有以前绑定(bind)到扩展方法的绑定(bind)都改为绑定(bind)到实例方法。如果您想在实例/扩展方法表单中调用 Reverse,则无法阻止这种情况,因为这是设计好的行为。如果实例方法至少与扩展方法版本一样好,那么实例方法将始终优先于扩展方法。
100% 防止这种情况的唯一方法是将扩展方法作为静态方法调用。例如
ExtensionMethods.Reverse(list);
新版本产品绑定(bind)新方法的问题不仅限于扩展方法(尽管问题可能更糟)。您可以对类型做很多事情来改变方法绑定(bind)的影响方式,例如实现新接口(interface)、继承或添加新转换
关于c# - 扩展方法和源代码的向前兼容性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2463933/
我正在使用以下键存储哈希集:measurement: , f.e. measurement:1482236501103 ,然后在稍后我想传递某个时间戳并获取从给定时间戳到结束的所有记录。但由于 Red
有 Home.vue 和 Statistics.vue 页面。 Home.vue 渲染 TableFields.vue 组件。在 Home.vue 中,有一些字段编号,在页面加载时设置了初始值“3”。
Spring MVC ModelAndView forward 不工作。下面的代码没有将请求转发到 Name.jsp。非常感谢您的帮助。 package main.java.com.mkyong.co
我有一个这样的值列表, lst = [1, 2, 3, 4, 5, 6, 7, 8] 期望输出 : window size = 3 1 # first element in the list
我正在尝试将硬币类移动到按下键时的适当元素。但是,如果元素的名称相似,我不确定如何正确导航 DOM 树。另外,我根据按下键(e.which)向上/向下移动,但如果硬币在某些地方,我需要旋转回到顶部或底
我需要制作一个不循环的幻灯片,但实际上在幻灯片之间弹跳:例如,如果我有 3 张幻灯片,我希望幻灯片顺序为: 1 -> 2 -> 3 -> 2 -> 1 -> 2 ... 我想出了这个解决方案(使用 j
我只想获取下一次迭代中的元素(使用基于范围的 for 循环) 我试过类似的东西: *(&x+1) 应该表示“i+1”,如果“i”在这里是一个迭代器的话 bool factorChain(std::ve
我有一个 slider ,其可能值在 0 到 1 之间,步长为 0.1 例如,如果我在起点移动 slider ,动画将从 (0%) 开始,如果我将 slider 移动到 0.5 ( 50%) 表示将从
这个问题在这里已经有了答案: python time subtraction (1 个回答) 关闭 9 年前。 我想实现的很简单: time.time() 不太可读。如何获得: 例如 time.ti
如何在 html 中显示此 ► 播放(向前)或向右实心箭头符号? 最佳答案 是的,►,但它在所有浏览器中看起来可能不一样。 关于html - 如何在 html 中显示 ► 播放(向前)或向右实心箭头符
我正在开发 wpf c# 应用程序,我需要检测用户何时按下“/ ” 但我找不到“/ ” e.Key,我看到有Key.OemBackslash和类似的东西,但我找不到“/”(正斜杠)的正确事件.....
我有两个数据集,(dt1) 一个带有“开始”日期,每个 ID 最多两个条目(因为这些是 L 或 R 眼手术的条目)和一个 (dt2) 第二个数据库,其中包含多个日期之前和之后开始日期。这些不仅限于眼科
我有使用 3 个欧拉 Angular (aRotX、aRotY、aRotZ)在其位置(aX、aY、aZ)显示模型的代码: var m = mat4.create(); mat4.identity(m)
我需要从方向 vector (vForward) 获取旋转矩阵 我还有 vRight 和 vUp vector 。所有这些 vector 都是单位 vector 。 我只需要得到旋转矩阵。 要获得仅在
我是一名优秀的程序员,十分优秀!