可比类型的C#泛型

问题描述

比方说,我有一个这样的功能,这个功能就在ITU之外,用于H264视频解码:

Clip3(x,y,z)
{
   if (z < x) return x;
   else if (z > y) return y;
   else return z;
}

在ITU文档中,伪代码被列为sans-data类型,实质上意味着任何数字数据类型。可以是字节,整数,整数,双精度数,浮点数,等等。

这可以编译,但是它是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)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,3)
2
(uint)AVC.AVCChunk.Clip3(1,3)
2

可以说,我在生产中使用此方法有些谨慎。有更好的选择吗?

解决方法

您可以将通用参数T约束为IComparable<T>,并使用CompareTo而不是<>运算符:

T Clip3<T>(T x,T y,T z) where T: IComparable<T>
{
   if (z.CompareTo(x) < 0) return x;
   else if (z.CompareTo(y) > 0) return y;
   else return z;
}