c#编译器试图编译到错误的重载方法

本文关键字:错误 重载 方法 编译 编译器 | 更新日期: 2023-09-27 18:06:27

我的项目是在VS2012使用。net 4.5。

在我的类中有以下重载方法:

public SalesOrder GetSalesOrder(int salesOrderID, bool forceRefresh = false)
{
    using (iSeriesUOW uow = new iSeriesUOW())
    {
        return GetSalesOrder(uow, salesOrderID, forceRefresh);
    }
}
public SalesOrder GetSalesOrder(iSeriesUOW uow, int salesOrderID, bool forceRefresh = false)
{
    .... do some stuff here
}

我正在尝试使用以下方法调用第一个方法:

public void PopulateModel(string companyCode, int salesOrderID, bool forceRefresh)
{
    SalesOrders blSalesOrders = new SalesOrders(companyCode);
    SalesOrder salesOrder = blSalesOrders.GetSalesOrder(salesOrderID, forceRefresh);
    ... Other code here
}

编译器在GetSalesOrder调用中给了我一个错误:

The type 'DataAccess.iSeriesUOW' is defined in an assembly that is not referenced. You must add a reference to assembly 'Viper.DataAccess, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null'.  

如果我删除了GetSalesOrder中的forcerfresh,它会编译得很好。

我认为它试图调用第二个GetSalesOrder重载,但我不知道为什么,因为(int, bool)的签名显然在那里。

任何想法?

c#编译器试图编译到错误的重载方法

我认为它试图调用第二个GetSalesOrder重载,但我不知道为什么,因为(int, bool)的签名显然在那里。

真的很清楚吗?我们怎么知道没有从int到isseriesow的隐式转换?

你对c#编译器期望太高了;我们没有花任何时间在重载解析算法中构建聪明的"提前退出",这样,那些显然不适用的方法,或者适用但显然更糟糕的方法,就不会从磁盘加载它们的元数据!

c#编译器保留在编译时要求汇编引用的整个传递闭包的权利,以便它可以对程序进行完整的分析。在一些有限的场景中,您可能会意外地不提供整个传递闭包,但是您不能依赖于,并且Roslyn可能需要在某些场景中引用更多的程序集。

您应该养成为编译器提供程序集引用的传递闭包的习惯。

我会尝试显式设置参数值:

代替

 SalesOrder salesOrder = blSalesOrders.GetSalesOrder(salesOrderID, forceRefresh);

我试一试

public void PopulateModel(string companyCode, int salesOrderID, bool forceRefreshParam)
{
    SalesOrders blSalesOrders = new SalesOrders(companyCode);
    SalesOrder salesOrder = blSalesOrders.GetSalesOrder(salesOrderID, forceRefresh:forceRefreshParam);
    ... Other code here
}

类iSeriesUOW定义在哪里?尝试添加对程序集Viper的引用。