分享
三行代码  ›  专栏  ›  技术社区  ›  Manan Adhvaryu

既然在C#中不能有带隐式变量的lambda函数,在这里可以替换什么?

  •  0
  • Manan Adhvaryu  · 技术社区  · 1 周前

    我正在尝试实现一个基于平铺的二维游戏演示平台系统 this C++ code

    这是我写的,但由于var变量的使用,它没有编译。

     class GameLogic
    {
        // Level storage
        String sLevel;
        int nLevelWidth;
        int nLevelHeight;
    
        // Player Properties
        float fPlayerPosX = 1.0f;
        float fPlayerPosY = 1.0f;
        float fPlayerVelX = 0.0f;
        float fPlayerVelY = 0.0f;
        bool bPlayerOnGround = false;
    
        // Camera properties
        float fCameraPosX = 0.0f;
        float fCameraPosY = 0.0f;
    
        public GameLogic()
        {
             var GetTile = (ref int x, ref int y) =>
            {
                if (x >= 0 && x < nLevelWidth && y >= 0 && y < nLevelHeight)
                    return sLevel[y * nLevelWidth + x];
                else
                    return "";
            };
    
            var SetTile = (ref int x, ref int y, string c)=>                
            {
                if (x >= 0 && x < nLevelWidth && y >= 0 && y < nLevelHeight)
                    sLevel[y * nLevelWidth + x] = c;
            };
    
        }
    }
    

    3 回复  |  直到 1 周前
        1
  •  3
  •   JakobFerdinand    1 周前

    它无法编译,因为 var 陈述。 当你使用 LambdaExpressions 如果要将其保存到变量中,则必须定义 delegate 键入。 ref 这里是变量。但这没关系,因为你不会改变 x y .

    您需要一个描述函数类型的委托。 你可以建立自己的 代表 但在C中,有两种内置类型。
    Action &安培; Action<T1-16> void
    Func<T1-17> 您可以定义返回类型

    这个 GetTile 函数需要两个 int 并返回 string .
    所以你可以用 Func<int, int, string>
    这个 SetTitle 函数有一个 一串 参数更多,但没有返回类型。
    Action<int, int, string> .

    internal class GameObject
    {
        private int nLevelWidth;
        private int nLevelHeight;
    
        public GameLogic()
        {
            Func<int, int, string> GetTile = (int x, int y) =>
            {
                if (x >= 0 && x < nLevelWidth && y >= 0 && y < nLevelHeight)
                    return sLevel[y * nLevelWidth + x];
                else
                    return "";
            };
    
            Action<int, int, string> SetTile = (int x, int y, string c)=>                
            {
                if (x >= 0 && x < nLevelWidth && y >= 0 && y < nLevelHeight)
                    sLevel[y * nLevelWidth + x] = c;
            };
        }
    }
    

    That´s a good article about delegates.

        2
  •  0
  •   jalsh    1 周前

    Lambda表达式没有编译时类型,但可以转换为任何匹配的委托或表达式类型。这就是为什么 according to MSDN this answer 通过 Eric Lippert

    所以:

    Func<int, int, string> GetTile = (int x, int y) =>
    {
        if (x >= 0 && x < nLevelWidth && y >= 0 && y < nLevelHeight)
            return sLevel[y * nLevelWidth + x];
        else
            return "";
    };
    
    Action<int, int, string> SetTile = (int x, int y, string c)=>                
    {
       if (x >= 0 && x < nLevelWidth && y >= 0 && y < nLevelHeight)
           sLevel[y * nLevelWidth + x] = c;
    };
    
        3
  •  0
  •   Ankush Jain    1 周前

    delegates 如下所示:

    delegate void ActionRef(ref int x, ref int y, string c);
    delegate string FuncRef(ref int x, ref int y);
    

    var ,你可以 代表

    public GameLogic()
    {
        FuncRef GetTile = (ref int x, ref int y) =>
        {
            if (x >= 0 && x < nLevelWidth && y >= 0 && y < nLevelHeight)
                return sLevel[y * nLevelWidth + x];
            else
                return "";
        };
    
        ActionRef SetTile = (ref int x, ref int y, string c) =>
        {
            if (x >= 0 && x < nLevelWidth && y >= 0 && y < nLevelHeight)
                sLevel[y * nLevelWidth + x] = c;
        };
    }