c# - 可比类型的 C# 泛型
问题描述
假设我有一个这样的功能,这个功能就在 ITU 之外,用于 H264 视频解码:
Clip3(x, y, z)
{
if (z < x) return x;
else if (z > y) return y;
else return z;
}
在 ITU 文档中,伪代码被列为 sans-data 类型,本质上暗示任何数字数据类型。可以是字节、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
可以这么说,我对在生产中使用这种方法有点谨慎。有没有更好的选择?
解决方案
您可以将泛型参数限制T
为IComparable<T>
, 和使用CompareTo
,而不是<
and>
运算符:
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;
}
推荐阅读
- c# - C# xml Serialize with XmlIgnore and Deserialize 问题
- javascript - 使用 BeautifulSoup (python) 在表中找不到值
- java - 仅允许在源级别 1.8 或更高版本中引用接口静态方法
- c++ - 为什么我的嵌套循环会产生相同的输出?
- ios - 如何在单个视图中重复播放两个不同的本地视频
- python - 两个 Pandas 数据框之间的交叉引用
- python-3.x - 字符串中的索引 - 绘图图
- handlebars.js - 拖放 div 列
- java - 在会话中存储和检索数组列表的问题
- angular - 如何在打字稿中提交表单(发布方法)后立即从服务器获取生成的ID