如果我将公共属性的 setter 的访问修饰符从私有更改为公共,是否会导致引用它的其他程序集发生任何重大更改?
UPDATE: 这个问题是我 2012 年 1 月博客的主题 https://ericlippert.com/2012/01/09/every-public-change-is-a-breaking-change/。感谢您提出的好问题!
我认为“重大更改”的意思是“当我重新编译依赖于该程序集的代码时,用于编译的代码是否仍然可以编译?”
根据这个定义,严格来说,是的,将以前私有的属性设置器公开是一个突破性的改变。假设您有以下代码:
// Assembly Alpha
public class Charlie
{
public int P { get; private set; }
}
public class Delta
{
public int P { get; set; }
}
然后在另一个引用 Alpha 的程序集中:
// Assembly Echo
class Foxtrot
{
static void M(Action<Charlie> f) {}
static void M(Action<Delta> f) {}
static void Golf()
{
M(y=>{y.P = 123;});
}
}
您编译程序集 Echo。 Foxtrot 类有一个方法 Golf,它对 M 进行重载解析。M 有两个重载;一个对查理采取行动,一个对达美采取行动。如果 lambda 参数 y 的类型为 Charlie,则 lambda 主体会产生可访问性错误,因此 M 的重载不是适用的候选者。重载决策选择第二个重载,编译成功。
现在您更改程序集 Alpha,以便 Charlie.P 的 setter 是公开的。你重新编译Echo。现在您会遇到重载解析错误,因为 M 的两个重载同样有效,并且没有一个比另一个更好。由于 Alpha 的变化,Echo 编译失败。您对 Alpha 的更改是一个重大更改。
问题不是“这是一个重大变化吗?”显然是;几乎每一个变化都是某种破坏性的变化。问题应该是,突破性的改变实际上是否会破坏任何人,如果是的话,与新功能的好处相比,修复破坏的成本是多少?
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)