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)的签名显然在那里。
任何想法?
我认为它试图调用第二个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的引用。