我正在尝试有条件地将方法分配给Func<>
。我试图分配的方法带有一个指针参数,似乎C#似乎不允许我将其与Func<>
一起使用。这是代码。
Func<ulong, ulong, ulong*, ulong> Multiply64Func;
if (Bmi2.X64.IsSupported)
{
Multiply64Func = Bmi2.X64.MultiplyNoFlags;
}
else
{
Multiply64Func = Multiply64;
}
这是我以后要使用的方式:
hi = Multiply64Func(c[0], b[0], loPtr);
以及相应的错误:error CS0306: The type 'ulong*' may not be used as a type argument
有什么解决方法,还是有办法使其正常工作?
当然,我可以这样做:
hi = Bmi2.X64.IsSupported ? Bmi2.X64.MultiplyNoFlags(c[0], b[0], loPtr) : Multiply64(c[0], b[0], loPtr);
但是,这部分代码对性能非常关键,在热循环中检查此速度会明显降低速度,因此为什么我要执行一次比较并分配对应的函数的方法。
更多的C#要做的是获取ref
参数-但是我不能更改Bmi2.X64.MultiplyNoFlags;
的签名,因为它不是我的代码。
答案 0 :(得分:0)
但是,这部分代码对性能至关重要,因此我发现在热循环中进行检查会显着降低速度-因此为什么我要执行一次比较
将结果缓存为布尔值并使用简单的答案。
bool useBmi = Bmi2.X64.IsSupported;
while (expensiveLoop)
{
hi = useBmi ? Bmi2.X64.MultiplyNoFlags(c[0], b[0], loPtr) : Multiply64(c[0], b[0], loPtr);
}
如果您坚持使用委托,则可以执行以下操作:
bool useBmi = Bmi2.X64.IsSupported;
ulong hi; //Must be declared outside the loop
Action multiply = useBmi
? new Action( () => { hi = Bmi2.X64.MultiplyNoFlags(c[0], b[0], loPtr); })
: new Action( () => { hi = Multiply64(c[0], b[0], loPtr); } );
while (expensiveLoop)
{
multiply();
}