C# 或工具错误:无法将lambda表达式转换为类型'';因为它不是委托类型
尝试运行示例:of时,以下代码块生成错误:C# 或工具错误:无法将lambda表达式转换为类型'';因为它不是委托类型,c#,lambda,or-tools,C#,Lambda,Or Tools,尝试运行示例:of时,以下代码块生成错误: int transitCallbackIndex = routing.RegisterTransitCallback( (long fromIndex, long toIndex) => { // Convert from routing variable Index to time matrix NodeIndex. var fromNode = manager.IndexToNode(fromInd
int transitCallbackIndex = routing.RegisterTransitCallback(
(long fromIndex, long toIndex) => {
// Convert from routing variable Index to time matrix NodeIndex.
var fromNode = manager.IndexToNode(fromIndex);
var toNode = manager.IndexToNode(toIndex);
return data.GetTimeMatrix()[fromNode, toNode]; }
);
错误CS1660:无法将lambda表达式转换为类型
“SWIGTYPE\u p\u std\u函数长\u长\u长\u长\u长”因为
它不是委托类型
我使用的是可用的最新版本:可用的最新版本()尚不支持将lambda表达式用作transit回调函数的参数。但是,它现在是,并且将在下一个版本中提供 目前,在发布新版本之前,有两种可能的解决方案:
- 第一个解决方案是,您可以下载最新版本的 或工具,并在您的计算机上编译它,以便从源代码安装
- 第二种解决方案是将参数替换为
来自
详情如下:Google.OrTools.ConstraintSolver.longlonglongtolong
LongLongToLong timeCallback = new TimeCallback(data, manager); int transitCallbackIndex = routing.RegisterTransitCallback(timeCallback);
TimeCallback
类可以有以下实现:
class TimeCallback : LongLongToLong
{
private long[,] timeMatrix;
private RoutingIndexManager indexManager;
public TimeCallback(DataModel data, RoutingIndexManager manager)
{
timeMatrix = data.GetTimeMatrix();
indexManager = manager;
}
override public long Run(long fromIndex, long toIndex)
{
// Convert from routing variable Index to time matrix NodeIndex.
int fromNode = indexManager.IndexToNode(fromIndex);
int toNode = indexManager.IndexToNode(toIndex);
return timeMatrix[fromNode, toNode];
}
}
注:对于
longlong timeCallback=new timeCallback(数据,管理器)代码>
垃圾收集器可以销毁此对象,因为寄存器在C#中不使其保持活动状态(注意:这将在final 7.0中使用委托和正确管理所有权进行更改)。为了避免GC,您必须在SolveWithParameters
方法之后对TimeCallback
对象调用GC.KeepAlive
下面是使用上述函数的示例:最新的可用版本()尚不支持将lambda表达式用作transit回调函数的参数。但是,它现在是,并且将在下一个版本中提供
目前,在发布新版本之前,有两种可能的解决方案:
- 第一个解决方案是,您可以下载最新版本的
或工具,并在您的计算机上编译它,以便从源代码安装
- 第二种解决方案是将参数替换为
来自
Google.OrTools.ConstraintSolver.longlonglongtolong
详情如下:
LongLongToLong timeCallback = new TimeCallback(data, manager);
int transitCallbackIndex = routing.RegisterTransitCallback(timeCallback);
其中TimeCallback
类可以有以下实现:
class TimeCallback : LongLongToLong
{
private long[,] timeMatrix;
private RoutingIndexManager indexManager;
public TimeCallback(DataModel data, RoutingIndexManager manager)
{
timeMatrix = data.GetTimeMatrix();
indexManager = manager;
}
override public long Run(long fromIndex, long toIndex)
{
// Convert from routing variable Index to time matrix NodeIndex.
int fromNode = indexManager.IndexToNode(fromIndex);
int toNode = indexManager.IndexToNode(toIndex);
return timeMatrix[fromNode, toNode];
}
}
注:对于longlong timeCallback=new timeCallback(数据,管理器)代码>
垃圾收集器可以销毁此对象,因为寄存器在C#中不使其保持活动状态(注意:这将在final 7.0中使用委托和正确管理所有权进行更改)。为了避免GC,您必须在SolveWithParameters
方法之后对TimeCallback
对象调用GC.KeepAlive
以下是使用上述方法的示例: