如果我们在 ==
表达式和 ulong
表达式之间使用 ulong?
运算符,那么似乎使用了运算符重载 bool ulong(ulong left, ulong right)
。
换句话说,运算符将两个表达式都视为非空。
在这个示例程序中,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;
}
}
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,它在这种情况下确实向您展示了一些令人困惑的东西:
不要对此感到困惑——正如@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/