首页 > 解决方案 > 可比类型的 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

可以这么说,我对在生产中使用这种方法有点谨慎。有没有更好的选择?

标签: c#generics

解决方案


您可以将泛型参数限制TIComparable<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;
}

推荐阅读