Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/299.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
可比类型的C#泛型_C#_Generics - Fatal编程技术网

可比类型的C#泛型

可比类型的C#泛型,c#,generics,C#,Generics,假设我有一个这样的函数,这是ITU的H264视频解码功能: Clip3(x, y, z) { if (z < x) return x; else if (z > y) return y; else return z; } 可以说,我对在生产中使用这种方法有点担心。有更好的替代方法吗?您可以将通用参数T约束为i可比较,并使用,而不是运算符: T Clip3<T>(T x, T y, T z) where T: IComparable<T> {

假设我有一个这样的函数,这是ITU的H264视频解码功能:

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

可以说,我对在生产中使用这种方法有点担心。有更好的替代方法吗?

您可以将通用参数
T
约束为
i可比较
,并使用,而不是
运算符:

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;
}
T Clip3(tx,tyz),其中T:i可比较
{
如果(z.CompareTo(x)<0)返回x;
如果(z.CompareTo(y)>0)返回y;
否则返回z;
}

我想更安全的方法是使用
IComparable
,因为大多数东西都是可比较的。在性能方面,最快的方法就是为您需要的每种类型创建一个重载。您的意思是您可以混合类型,还是对于任何特定的调用,这三种类型都是相同的?如果后者为真,则最好使用泛型,将可能的选择限制为值类型。为byte、char、ushort、short、uint、int等编写重载会很混乱,并且不符合DRY原则。以下内容不编译:T Clip3(T x,T y,T z),其中T:i可比较。它仍然会给出与T Clip3(T x,T y,T z)相同的“运算符”,其中T:struct,IComparable,不会使用与它相同的“运算符”进行编译,CompareTo是最重要的。反映到我期望的类型。因此,我只想说,如果使用IComparable实现泛型,您可以告别,>=,并反射到我期望的类型,不,不涉及反射;所有数字类型都有一个特定的IComparable实现。我的意思是,在对结果运行.GetType()之后,它给了我预期的结果,所以这很好,只是询问比较的必要性。@JohnErnest“你可以向,>=,和@Sweeper说再见,我也这么认为,谢谢你,尽管这让我达到了我需要的位置。
(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 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;
}