我对声明函数指针的 C# 方式感到困惑。我想在函数内声明一行一个函数指针变量,而不必添加类成员或类似的东西。
我正在尝试的是:
System.Func<KeyCode, bool> inputCheck = activeCharacter.continuous_fire ? Input.GetKey : Input.GetKeyDown;
我也尝试过使用 Action
(但显然它没有返回值)和 delegate
,但显然我弄错了。
我能以某种方式做到这一点吗(即我只是弄错了语法),或者唯一的方法是先声明一个delegate
原型(prototype)?
编辑:澄清一下,目前我必须这样做:
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;
}
最佳答案
您的代码原则上可以工作,条件运算符只是无法确定“方法组”和“方法组”之间的公共(public)类型。这样做的原因是方法可能被重载(即使它们不是您的情况),因此可以有多个签名。
您可以通过将任一参数显式转换为目标委托(delegate)类型来解决此问题:
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
。 snake_case
从未使用过。
换句话说,应该是:
activeCharacter.ContinuousFire
doFire
开火
关于c# - 我可以在函数内部声明一个函数指针吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19889159/