C# 我可以在函数中声明函数指针吗?

C# 我可以在函数中声明函数指针吗?,c#,function-pointers,C#,Function Pointers,我对声明函数指针的C#方法感到困惑。我想在函数中声明一行函数指针变量,而不必添加类成员或类似的东西 我尝试的是: System.Func<KeyCode, bool> inputCheck = activeCharacter.continuous_fire ? Input.GetKey : Input.GetKeyDown; 由于这看起来很糟糕,而且是冗余的(冗余几乎总是错误的),我想把Input.*函数放在一个变量中,然后检查一下 伪代码: bool do_fire=fa

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

我尝试的是:

System.Func<KeyCode, bool> inputCheck = activeCharacter.continuous_fire ? Input.GetKey : Input.GetKeyDown;
由于这看起来很糟糕,而且是冗余的(冗余几乎总是错误的),我想把Input.*函数放在一个变量中,然后检查一下

伪代码:

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

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

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

Func<KeyCode, bool> checkFire = activeCharacter.continuous_fire ?
        (Func<KeyCode, bool>)Input.GetKey : Input.GetKeyDown;
另外一句话:您的编码约定是一个混乱的混合体,您应该对此进行清理。C#通常使用
PascalCase
表示面向公众的标识符和所有类型,而
camelCase
表示其余类型<代码>蛇壳从未使用过

换句话说,它应该是:

  • activeCharacter.ContinuousFire
  • doFire
  • 火灾

委托与普通函数指针不同。它们同时指向一个实例和一个函数。您可以使用lambda语法:
Func inputCheck=(keyCode)=>…
编译器错误是什么?假设GetKey和GetKeyDown都是静态方法,并将keyCode作为参数并返回bool,然后继续\u fire返回布尔值,那份声明完全合法,真奇怪。。。尝试显式地将左侧操作数强制转换为func。谢谢,成功了!关于你指出的第二个问题,那是因为我可能在里面添加了更多的东西,而不仅仅是
do\u fire
assignment。谢谢你也指出了这些混乱的惯例!:)
Func<KeyCode, bool> checkFire = activeCharacter.continuous_fire ?
        (Func<KeyCode, bool>)Input.GetKey : Input.GetKeyDown;
bool do_fire = checkFire(Fire);