我的项目使用.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)的签名显然存在。
有什么想法吗?
答案 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的引用。