如果我们在 == 表达式和 ulong 表达式之间使用 ulong? 运算符,那么似乎使用了运算符重载 bool ulong(ulong left, ulong right)

c# - "ulong == ulong?"评估为"ulong == ulong"正常工作-LMLPHP

换句话说,运算符将两个表达式都视为非空。

在这个示例程序中,equal 正确地变成了 false,没有异常(exception)。

void Main()
{
    var temp = new Temp(0);
    object temp2 = null;

    var equal = temp.Id == (temp2 as Temp)?.Id; // False :) but how?
}

public class Temp
{
    public ulong Id {get;}

    public Temp(ulong id)
    {
        this.Id = id;
    }
}
  • 这个怎么不扔?从值null的ulong?ulong不会进行任何转换。 (ulong)(ulong?)null 抛出:“可空对象必须有一个值。”
  • 这是否为 ulong? 的每个可能值返回正确的值,包括空值?如果是这样,如何? ulong? 类型比 ulong 多一个可能的值,因此应该有一组两个值映射到相同的 ulong 值,这会引入一个误报“真”结果。

  • 理论上,我可以想象 null 被合并到 default(ulong) ,但是我上面例子中的结果将是正确的,这将是一个不正确的答案。正如我们所看到的,编译器不会犯该错误-它会正确回答。

    最佳答案

    来自 MSDN :



    您没有使用运算符:

    bool ==(ulong left, ulong right)
    

    您正在使用提升的运算符:
    bool ==(ulong? left, ulong? right)
    

    此运算符采用两个 ulong? 参数,如果两者都为 null,或者两者都不为 null 且具有相同的值,则返回 true。

    您可能正在查看 Visual Studio,它在这种情况下确实向您展示了一些令人困惑的东西:

    c# - "ulong == ulong?"评估为"ulong == ulong"正常工作-LMLPHP

    不要对此感到困惑——正如@mjwills 在评论中指出的 this is a known issue

    如果你这样写:
    public bool M(ulong a, ulong? b) {
        return a == b;
    }
    

    然后编译器生成以下代码:
    public bool M(ulong a, ulong? b)
    {
        ulong? num = b;
        return (a == num.GetValueOrDefault()) & num.HasValue;
    }
    

    如果 num.GetValueOrDefault()0 ,则 b 返回 null ,否则返回 b 的值。所以 M 返回 true 当且仅当 b 不为空,并且与 a 具有相同的值。

    SharpLab

    关于c# - "ulong == ulong?"评估为"ulong == ulong"正常工作,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/58394185/

    10-10 19:46