如何解决可比类型的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;
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。