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