3

我对声明函数指针的 C# 方式感到困惑。我想在函数内声明一个函数指针变量,而不必添加类成员或类似的东西。

我正在尝试的是:

System.Func<KeyCode, bool> inputCheck = activeCharacter.continuous_fire ? Input.GetKey : Input.GetKeyDown;

我也尝试过使用Action(但显然它没有返回值)和delegate,但显然我弄错了。

我可以以某种方式做到这一点(即我只是语法错误),还是唯一的方法是首先声明一个delegate原型?

编辑:澄清一下,目前我必须这样做:

    bool do_fire=false;
    if (activeCharacter.continuous_fire)
    {
        if (Input.GetKey( Fire ))
        {
            do_fire=true;
        }
    }
    else
    {
        if (Input.GetKeyDown( Fire ))
        {
            do_fire=true;
        }
    }

由于这看起来很糟糕而且多余(而且多余几乎总是错误的),我只想将 Input.* 函数放在一个变量中并检查它。

伪代码:

    bool do_fire=false;
    function keyCheck = activeCharacter.continuous_fire ? Input.GetKey : Input.GetKeyDown;
    if (keyCheck( Fire ))
    {
        do_fire=true;
    }
4

1 回答 1

3

您的代码原则上有效,条件运算符无法确定“方法组”和“方法组”之间的共同类型。这样做的原因是方法可能被重载(即使它们不在您的情况下),因此可以有多个签名。

您可以通过将任一参数显式转换为目标委托类型来解决此问题:

Func<KeyCode, bool> checkFire = activeCharacter.continuous_fire ?
        (Func<KeyCode, bool>)Input.GetKey : Input.GetKeyDown;

此外,即使您引入了inputCheck. 没有必要ifdo_fire而是直接分配:

bool do_fire = checkFire(Fire);

附加说明:您的编码约定是混乱的组合,您应该清理它。C# 通常用于PascalCase面向公众的标识符和所有类型,以及camelCase其他类型。snake_case从未使用过。

换句话说,它应该是:

  • activeCharacter.ContinuousFire
  • doFire
  • fire
于 2013-11-10T12:29:18.050 回答