c# – 为什么我可以比较sbyte和所有其他数字类型*除了ulong?

你可以在sbyte和byte,int,uint,short,ushort,long,double和float之间进行&gt,< ==等比较。但不是ulong。 我的大脑爆炸。任何人都可以解释为什么sbyte可以比较uint,但不是ulong?

public bool sbyte_ulong_compare(sbyte x, ulong y)
{
    return x < y;  // compiler error CS0019
}

此外,使用unchecked不使事情工作更好。脑融化。

另一个编辑。这工作:

public bool sbyte_ulong_compare(sbyte x, ulong y)
{   
    //
    // returns x < y
    //
    if (x < 0)
        return true;

    if (y > 127)
        return true;

    return ((long)x < (long)y);
}
dthorpe和乔恩的答案是接近,但不是很正确。

正确的推理如下。

规范说明:

For an operation of the form x op y,
where op is a comparison operator,
overload resolution is
applied to select a specific operator
implementation.

OK,什么是操作符实现重载分辨率必须使用?他们是:

bool operator <(int x, int y);
bool operator <(uint x, uint y);
bool operator <(long x, long y);
bool operator <(ulong x, ulong y);
bool operator <(float x, float y);
bool operator <(double x, double y);
bool operator <(decimal x, decimal y);

加上所有枚举类型的枚举less-than运算符,以及上述每个类型的提升到可空的版本。

过载分辨率必须首先消除不适用的运算符,然后从剩余的适用运算符集中确定最佳运算符。

int,uint,long和enum运算符(以及它们的提升形式)都被删除,因为ulong不会隐式地转换成这些类型。

uint和ulong运算符(及其提升的形式)都被删除,因为sbyte不会隐式转换为这些类型。

那就离开

bool operator <(float x, float y);
bool operator <(double x, double y);
bool operator <(decimal x, decimal y);

和他们的提升形式。我们现在必须从这六个中确定最好的操作符。

我们是什么意思是“最好的”?当比较两个运算符时,具有更多特定操作数类型的运算符是更好的运算符。 “更具体”我的意思是“虎”比“动物”更具体,因为所有老虎都可以转换为动物,但不是所有的动物都可以转换为虎。

显然,未提升的形式优于所有相应的提升形式。非可空类型比其对应的可空类型更具体,因为不可空类型总是可转换为其可空类型,反之亦然。我们可以消除提升的形式。

剩下三个。这三个是最好的?

float比double更具体。每个float都可以转换为double,但不是每个double都可以转换为float。因此消除双重。剩下两个。

bool operator <(float x, float y);
bool operator <(decimal x, decimal y);

其中哪些是最好的?没有从float到decimal的隐式转换。没有从decimal到float的隐式转换。因此,两者都不比另一个更好。

因此,不能确定最佳运算符。过载解决失败。

我们决定报告一个通用的错误消息,简单地说,没有这样的运算符,你想要什么,而不是给出一个看似奇怪和令人困惑的错误消息“操作符重载解析失败,因为float不是更好,也不会比十进制”。我认为这是一个合理的设计选择。

http://stackoverflow.com/questions/4327679/why-can-i-compare-sbyte-to-all-the-other-numeric-types-except-ulong

本站文章除注明转载外,均为本站原创或编译
转载请明显位置注明出处:c# – 为什么我可以比较sbyte和所有其他数字类型*除了ulong?