C# 或工具错误:无法将lambda表达式转换为类型'';因为它不是委托类型

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

尝试运行示例:of时,以下代码块生成错误:

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


以下是使用上述方法的示例: