我正在编写一个表示LED的类。基本上有3个
我刚开始学习C#,并使用了uint1,但它比我想要的8位更大。在编写自己的Clamp方法之前,我在网上搜索了一下,并找到了这个看起来不错的答案,其中提供了一个扩展方法。问题是它无法推断类型为
uint
值,分别为r、g和b,范围在0到255之间。我刚开始学习C#,并使用了uint1,但它比我想要的8位更大。在编写自己的Clamp方法之前,我在网上搜索了一下,并找到了这个看起来不错的答案,其中提供了一个扩展方法。问题是它无法推断类型为
uint
。为什么会这样?这段代码中到处都是uint。我必须明确给出类型才能使其正常工作。class Led
{
private uint _r = 0, _g = 0, _b = 0;
public uint R
{
get
{
return _r;
}
set
{
_r = value.Clamp(0, 255); // nope
_r = value.Clamp<uint>(0, 255); // works
}
}
}
// https://dev59.com/BHE85IYBdhLWcg3wpFEa#2683487
static class Clamp
{
public static T Clamp<T>(this T val, T min, T max) where T : IComparable<T>
{
if (val.CompareTo(min) < 0) return min;
else if (val.CompareTo(max) > 0) return max;
else return val;
}
}
1一个错误,当然使用 byte
是正确的方式。但我仍然对这个问题的答案感兴趣。
IComparable<T>
接口应该提供一个完全的排序。鉴于此,为什么即使在字符串上,Clamp
也不是语义上正确的呢?@RonBeyer - Rawlingstring
实现了IComparable<string>
接口,但对于Clamp
来说,在语义上并不正确(也许是char
,但不是string
)。 - Ron BeyerLed
在匈牙利命名法中变成了cLed
。我希望这只是 @DStanley 的一个失败的玩笑尝试。 - Ron Beyeruint
来表示除了与使用uint
的非托管代码进行交互之外的其他内容。 在 C# 中,如果您希望表示一个合理大小的整数量,请使用int
,无论该域中是否存在合理的负数。 您会注意到,在 C# 中,字符串和数组的长度都是int
,即使这些值永远不会是负数。 - Eric Lippert