假设我有这样一个函数,它直接来自于ITU H264视频解码方面的内容:
在ITU文档中,伪代码列为“无数据类型”,实质上暗示可以使用任何数值数据类型。可能是byte、int、uint、double、float等。
这段代码可以编译通过,但在2020年是否是最佳方案?
Clip3(x, y, z)
{
if (z < x) return x;
else if (z > y) return y;
else return z;
}
在ITU文档中,伪代码列为“无数据类型”,实质上暗示可以使用任何数值数据类型。可能是byte、int、uint、double、float等。
这段代码可以编译通过,但在2020年是否是最佳方案?
dynamic Clip3(dynamic x, dynamic y, dynamic z)
{
if (z < x) return x;
else if (z > y) return y;
else return z;
}
看看在第一次运行时,在VS2019社区版的即时窗口中会发生什么:
(uint)AVC.AVCChunk.Clip3((uint)1, (uint)2, (uint)3)
error CS0656: Missing compiler required member 'Microsoft.CSharp.RuntimeBinder.Binder.Convert'
Convert.ToUInt32(AVC.AVCChunk.Clip3((uint)1, (uint)2, (uint)3))
error CS0656: Missing compiler required member 'Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfo.Create'
Convert.ToUInt32(AVC.AVCChunk.Clip3(1, 2, 3))
error CS0656: Missing compiler required member 'Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfo.Create'
AVC.AVCChunk.Clip3(1, 2, 3)
2
(uint)AVC.AVCChunk.Clip3(1, 2, 3)
2
简言之,我有点担心在生产中使用这种方法。是否有更好的替代方案?
IComparable
,因为大多数东西都是可比较的。就性能而言,最快的方法是为您需要的每种类型创建一个重载。 - zaitsman