0

我的项目在 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 中的 forceRefresh,它编译得很好。

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

有任何想法吗?

4

3 回答 3

4

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

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

您对 C# 编译器的期望过高;我们没有花任何时间在重载解析算法中构建聪明的“早期输出”,以便那些明显不适用或适用但显然更糟的方法没有从磁盘加载它们的元数据!

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

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

于 2013-03-28T19:20:36.683 回答
3

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

代替

 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
}
于 2013-03-28T19:03:35.987 回答
2

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

于 2013-03-28T19:05:20.050 回答