c# - 修改公共(public)属性的访问修饰符是否是重大更改?

标签 c#

如果我将公共(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/

相关文章:

c# - 这两个c#抽象类有什么区别?

c# - 捕获没有焦点的击键

c# - VS2017 为多个框架目标创建一个库

c# - 有没有办法在运行时构建新类型?

c# - 从 Controller MVC ASP 4 中的列表框中获取项目

c# - Log4Net 不释放资源

c# - 使用 protobuf-net 序列化基类属性

c# - 从 2012 年更新到 2013 年后无法加载文件或程序集“System.Web.Http 4.0.0”

c# - C# 中的 Heredoc 字符串

c# - EF 转换问题