我可以在函数内声明一个函数指针吗?

时间:2013-11-10 11:28:17

标签: c# function-pointers

我对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;
    }

1 个答案:

答案 0 :(得分:3)

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

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

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

此外,即使您已经介绍了inputCheck,您的测试代码也会毫无疑问地复杂化。没有任何if。直接指定do_fire

bool do_fire = checkFire(Fire);

另外一句话:你的编码约定是一个混乱的混合,你应该清理它。 C#通常使用PascalCase表示面向公众的标识符和所有类型,其余部分使用camelCase。 <{1}}永远不会被使用。

换句话说,它应该是:

  • snake_case
  • activeCharacter.ContinuousFire
  • doFire