C#编译器正在尝试编译为错误的重载方法

时间:2013-03-28 18:58:26

标签: c# compiler-errors overloading

我的项目使用.Net 4.5在VS2012中。

我班上有以下重载方法:

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中删除了forceRefresh,它编译得很好。

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

有什么想法吗?

3 个答案:

答案 0 :(得分:3)

  

我认为它试图调用第二次GetSalesOrder超载,但我不知道为什么因为(int,bool)的签名明显存在。

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

你期望从C#编译器中获得相当多的东西;我们没有花时间建立聪明的早期出局"进入重载决策算法,以便明显不适用或适用但明显更差的方法没有从磁盘加载元数据!

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

你应养成为编译器提供汇编引用的传递闭包的习惯。

答案 1 :(得分:2)

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

而不是

 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
}

答案 2 :(得分:2)

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