当前位置: 首页 > 知识库问答 >
问题:

为什么nullable不重载==opertator?

韩景胜
2023-03-14
Nullable<Int32> x = 5;
Nullable<Int32> y = 10;

if (x == y) {
   ...
}

如果我的理解是正确的,那么为什么不将nullable 的==和!=运算符重载为:

public struct Nullable<T> where T : struct {
   ...
   public static bool operator == (Nullable<T> a, Nullable<T> b) {
      ...// do some nesseary null check
      return value.Equals(other);
   }
}

那我们就可以省下两个铸件了?

共有1个答案

齐才艺
2023-03-14

可为空的值类型上的运算符实际上在语言规范中是“硬编码的”。他们被称为升降机操作员。

提升运算符允许对不可为空的值类型进行操作的预定义运算符和用户定义运算符也与这些类型的可为空的形式一起使用。

对于相等运算符,

在Sharplab.io上,您可以看到该版本的编译器编译了以下内容:

public bool F(int? a, int? b) {
    return a == b;
}

致:

public bool F(Nullable<int> a, Nullable<int> b)
{
    Nullable<int> num = a;
    Nullable<int> num2 = b;
    return (num.GetValueOrDefault() == num2.GetValueOrDefault()) & (num.HasValue == num2.HasValue);
}

这方面的一般实施办法是:

public static bool operator == (Nullable<T> a, Nullable<T> b) {
    return (a.GetValueOrDefault() == b.GetValueOrDefault()) && (a.HasValue == b.HasValue);
}
 类似资料:
  • 问题内容: 我有一个带注释的实体。 如果我负责创建脚本,为什么要指定何时可以使用关键字在数据库中创建列?是否有任何示例显示在字段中使用此属性的好处? 问题答案: 更好的错误消息和错误处理,尤其是如果您还添加了JSR303 @NotNull批注 。 如果您将列创建为,但不告诉JPA它不是null,则JPA会假定null值可以。当您尝试使用空值保存对象时,它将继续将其发送到数据库,并且您会收到数据库级

  • 以下是MWE: 奇怪的是,无论我键入

  • 问题内容: 从C ++到Java,一个显而易见的未解决问题是Java为什么不包括运算符重载? 没有;比这简单;吗? 是否存在已知的原因,有效的论据,不使运算符重载?原因是任意的还是迷失了时间? 问题答案: 假设你想覆盖所引用的对象的先前值a,则必须调用成员函数。 在C ++中,此表达式告诉编译器在堆栈上创建三(3)个对象,执行加法,然后将结果值从临时对象复制到现有对象中。 但是,在Java中,不对

  • 请考虑以下情况: 这将无法编译,并出现关于< code>A::A的不明确重载的错误。两个候选人都被认为是可行的,因为要求很简单: 其次,为了使 成为一个可行的函数,每个参数都应该存在一个隐式转换序列 (13.3.3.1),该序列将该参数转换为 的相应参数。 虽然有一个从<code>double</code>到<code>int</code>的隐式转换序列,但<code>A(int)</code>重

  • 问题内容: 码 输出量 这是预期的行为吗?如果是这样,那为什么呢?我期望:char,Int 注意:我正在使用Java 8 问题答案: 当编译器确定选择哪种重载方法时,带有varargs()的方法具有最低的优先级。因此,当您使用单个参数调用时会选择,因为a 可以自动提升为。 JLS 15.12.2 : 第一阶段(第15.12.2.2节)执行重载解析 ,不允许 装箱或拆箱转换,也 不允许 使用可变Ar