在更改了引用项目的方法签名后,我遇到了一个奇怪的问题.

让我解释一下发生的事情: 我得到了50个项目P1、P2、..、P50,它们依赖于包含公共功能的公共项目C0. P1到P50在客户之间分发,除非有必要,否则我不想重建和重新分发它们.

从P1到P50的项目包含此类

public partial class LogView: UserControl {
    private void buttonReadUnit_Click(object sender, EventArgs e) {
        readUnit();
...

public partial class LogView : IView {
    public void readUnit() {    
        UnitBusyMode.Begin(Application.OpenForms[0],true);
...

C0包含

public partial class UnitBusyMode : Form{
   public static Thread Begin(Form owner, bool cancellable = false){
...

昨天我把开始的方法改成了这个

public static Thread Begin(Form owner, bool cancellable = false, int setTemplate= TEMPLATE_NORMAL){

然后,我重新构建项目C0并将其分发给客户. 但在这一点上,我意识到许多P项目在readUnit();调用线上出现错误. 错误类似于:ReadUnit()找不到签名为Begin(Form owner, bool cancellable = false)的方法.

这非常奇怪,因为新的签名与旧的UnitBusyMode.Begin(Application.OpenForms[0],true)呼叫兼容.

重新编译C0项目无济于事. 解决此问题的唯一方法是将所有的P1项目重新编译为P50项目.

这很奇怪,因为错误没有出现在Begin方法调用行:UnitBusyMode.Begin(Application.OpenForms[0],true);

但是在对方法readUnit();的调用上

你知道是什么导致了这个问题吗?如何防止它?

谢谢

推荐答案

C#中的可选参数是语法糖,通过将缺省值作为实际参数填充到所有未指定其自身参数值的方法调用中来实现.

这通常不会被注意到,直到您将方法及其调用者分离到单独的DLL中,并决定向方法添加可选参数.所有调用它的项目都必须重新编译,因为如果你不这样做,它们将继续寻找一个具有原始签名的方法,但该方法不再存在-现在只有一个方法和一个附加的方法(必需的!)参数,而默认值只有在重新编译时才添加到调用站点.

对于从0个可选参数变为1个可选参数的情况,可以通过添加添加新参数的新重载来解决此问题.但是,如果所讨论的方法已经有一个可选参数,并且您想要添加另一个参数,那么这将变得非常困难(如果不是不可能的话).然后,唯一的解决方案可能是重新编译所有客户端程序.


PS自从2010年左右在C#4中引入可选参数以来,这个问题和修复/解决方法就已经知道了,例如,参见https://haacked.com/archive/2010/08/10/versioning-issues-with-optional-arguments.aspx/

Csharp相关问答推荐

在2D数组中绘制椭圆

无法从具有一对多关系的C#类中使用Swagger创建记录

如何使用Unity和MRTK3将手网添加到Hololens 2应用程序中

C#相同名称的枚举方法和normal方法,参数类型不同

System. InvalidOperationException:无法将数据库中的字符串值i转换为映射的ItemType枚举中的任何值''''

使用LINQ to XML获取元素值列表是不起作用的

我需要两个属性类吗

如何在Visual Studio代码中更改大括号模式{},用于C#语言

实体核心框架--HasColumnType和HasPrecision有什么不同?

将XPS转换为PDF C#

如何在没有额外副本的情况下将存储在IntPtr下的原始图像数据写入WinUI3中的Image控件?

Nuget包Serilog.Sinks.AwsCloudwatch引发TypeLoadExceptions,因为父类型是密封的

UWP中的任务和界面

尽管保证密钥不同,但已添加相同密钥的项(&Q;)

在EF Core中,有没有什么方法可以防止在查询中写入相同的条件,而代之以表达式?

NET8 Maui&;iOS:AppCenter崩溃错误

RabbitMQ群集的MassTransit配置问题

ASP.NET MVC数据批注验证组复选框

Visual Studio 17.8.0制表符自动完成问题--三缩进

自定义ConsoleForMatter中的DI/Http上下文