【发布时间】:2020-04-19 09:54:22
【问题描述】:
我有一个方法如下:
int coerce(int val, int min=0, int max = 10)
{
if (val < min)
return min;
if (val > max)
return max;
return val;
}
现在,我必须为byte、float、double 和其他数字类型制作它。
众所周知,为这些类型制作大量类似的方法是非常无效的,所以我想将它变成一个泛型方法。以下是我尝试做的:
T coerce<T>(T val, T min=(T)0, T max=(T)10) where T:IComparable
{
// ... same as the above ...
}
我知道代码没有运行,这就是我要求这样做的原因。我目前对两个问题感到困惑:
-
如何比较
T类型?Visual Studio 警告运算符
<和>。我尝试使用where T:IComparable,但它并没有解决我的问题。 -
如何为泛型参数设置默认值?
我尝试使用
(T)0和(T)10。但无论如何,这不是一个好的选择。
这可能是一个简单的问题,但我无法从 Google 找到答案。
【问题讨论】:
-
你看过msdn的例子了吗? docs.microsoft.com/en-us/dotnet/api/…
-
IComparable定义CompareTo,而不是比较运算符。因此,例如,您需要使用val.CompareTo(min) == -1而不是val < min -
... 你不能使用
int为你的通用实现默认值,你能做的最好是int min = default但IMO你不应该尝试在这个方法中实现默认值。跨度> -
如何为泛型类型参数设置默认值? - 您可以使用
Default(T)将其设置为数据类型的默认值。在你的情况下,0 代表整数。 -
我认为
Clamp(),而不是coerce(),将是这个方法更合适和知名的名称。考虑到这一点,Where can I find the “clamp” function in .NET? 的许多答案都提供了一个通用的实现。
标签: c# .net generics comparison-operators