如果我将公共(public)属性的 setter 的访问修饰符从私有(private)更改为公共(public),是否会导致引用它的其他程序集发生重大变化?
最佳答案
更新:This question was the topic of my blog in January 2012 .感谢您提出很好的问题!
我假设“中断更改”是指“当我重新编译依赖于此程序集的代码时,用于编译的代码是否仍然可以编译?”
根据该定义,严格来说,是的,将过去私有(private)的属性 setter 公开是一项重大更改。假设你有这样的代码:
// 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 有两个重载;一个对 Charlie 采取行动,一个对 Delta 采取行动。如果 lambda 参数 y 是 Charlie 类型,则 lambda 主体会产生可访问性错误,因此 M 的重载不是适用的候选者。重载解析选择第二个重载,编译成功。
现在您更改程序集 Alpha,以便 Charlie.P 的 setter 公开。你重新编译 Echo。现在你得到了一个重载解析错误,因为 M 的两个重载同样有效并且没有一个比另一个更好。由于 Alpha 的变化,Echo 编译失败。您对 Alpha 的更改是一项重大更改。
问题不是“这是一个重大变化吗?”显然是;几乎每一个变化都是某种破坏性的变化。问题应该是重大更改是否会在实践中真正破坏任何人,如果是这样,与新功能的好处相比,修复破坏的成本是多少?
关于c# - 修改公共(public)属性的访问修饰符是否是重大更改?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8580589/