【问题标题】:What does it mean when it says 'int' is never equal to 'null' of type 'int?' [duplicate]当它说“int”永远不等于“int”类型的“null”时,这是什么意思? [复制]
【发布时间】:2013-07-09 13:54:33
【问题描述】:

我正在尝试比较以下内容:

if (e.CreatedBy == null) 

但这给了我一个错误提示:

表达式的结果始终为“假”,因为值类型为 “int”永远不等于“int”类型的“null”?

谁能帮我检查一下 CreatedBy 的值是否尚未设置?注意这里是 CreatedBy 的定义:

public int CreatedBy { get; set; }

【问题讨论】:

  • 您需要检查 e.CreatedBy == 0(如果 0 不是用于该字段的实际值),或者将 CreatedBy 更改为 int? 类型。
  • 设置为 32 位无符号整数的变量不能为 null。您必须将 CreatedBy 设为 nullable 变量。

标签: c#


【解决方案1】:

int 是一个值类型,这意味着它永远不能为空。它的默认值为0。如果要存储null而不是0,则需要将类型更改为int?,这是一个可为空的int类型。要了解有关 Nullable 类型的更多信息,请查看“Nullable Types (C#)

【讨论】:

    【解决方案2】:

    CreatedBy 的类型是int,这是一个不能取值null 的类型。

    根据您目前的情况,无法检测到是否设置了CreatedBy。假设它的默认值为0。然后将值设置为1,然后再设置回0。现在,如何区分当前的0 和未修改的原始0

    如果您要做的是检测该值是否为0,那么我认为我不需要告诉您该怎么做。如果您真的想检测是否曾经设置过该值,则需要维护一个 bool 标志并在属性的设置器第一次执行时设置该标志。

    【讨论】:

      【解决方案3】:

      int 值是非Nullable 类型见 http://msdn.microsoft.com/en-us/library/1t3y8s4s(v=vs.80).aspx

      如果你想检查是否设置或不使用

      //GetValueOrDefault()
      
      
      private int? createdBy;
      
      public int CreatedBy 
      {
        get { return createdBy.GetValueOrDefault(-1); }
        set { createdBy= value; }
      }
      
      
      
      ///your code
      
      if(e.CreatedBy == -1)
      {
      //not set
      }else
      {
      //set
      }
      

      【讨论】:

      • 好主意,将int? 封装在int 属性后面!
      【解决方案4】:

      int 是一个不能为空的值类型。如果你想让一个值类型可以为空,你需要使用int?,这是一种创建Nullable这样的对象的简写方式

      Nullable<int> myNullable = new Nullable<int>();
      

      【讨论】:

      • Nullable 不是引用类型,而是值类型。
      • @Servy 是对的。 Nullable 是一个结构体,它是一个值类型。
      • @Servy 谢谢,已更正。
      【解决方案5】:

      谁能帮我看看如何检查 CreatedBy 的值是否尚未设置?

      不,这是不可能的,因为值类型(如 int)不能为空。

      但是您可以使用Nullable Types,它让您将其声明为“Nullable of int”,然后它可以为 null。

      来自我链接到的文档:

      可空类型可以表示其基础值类型的正确值范围,外加一个额外的空值

      要使您的属性为“Nullable of int”,只需添加一个问号:

      public int? CreatedBy { get; set; }
      

      上面的语法实际上只是以下的简写:

      public Nullable<int> CreatedBy { get; set; }
      

      【讨论】:

        【解决方案6】:

        因为 int 的默认值是 0 而不是 null。 e.CreatedBy 永远不会有 null 这样的值,所以最好将它与 0 进行比较。

        if (e.CreatedBy == 0) 
        

        nullable int 可以等于 null 但不能为 null(默认 int)永远不会等于 null

        【讨论】:

          【解决方案7】:

          你使用的是 int 而不是 nullable int 所以它永远不能为空?

          【讨论】:

            【解决方案8】:

            您可以更改 CreatedBy 的定义,如下所示:

            public int? CreatedBy { get; set; }

            您可以进行以下检查

            if (e.CreatedBy == null)if (e.CreatedBy.HasValue)

            【讨论】:

              【解决方案9】:

              好的,很多答案都解释了显而易见的问题。以下是一些实际解决问题的想法:

              另一种选择:只需使用默认值 0。

              现在,您可以检查if(CreatedBy &gt; 0),而不是在原始代码中检查null

              如果您更喜欢“显式”,您可以使用 -1 显式指示“空”或“未设置”,方法是在构造函数中将其设置为默认值。我并不是说这在所有情况下都是理想的,但它相当简单:

              public YourClass(){
                   CreatedBy = -1;
              }
              
              public int CreatedBy { get; set; }
              

              显然,这会导致测试:if(CreatedBy != -1)

              另一种选择是使用nullable of int,正如一些人所建议的那样,并检查null。这样做的缺点是必须处理 int? 类型,而不是更“通用”的 int,尽管你在任何地方都使用该值。这可能不是问题,但有时会很烦人,尤其是当您将值传递给其他方法、类或其他任何东西时..

              【讨论】:

                【解决方案10】:

                要回答您的问题,您无法检查该值是否已设置,您只能检查它现在具有的值。任何属性在初始化时都会有一个“默认”值。对于大多数类型(包括 Nullable),默认值为 null,但对于 int,默认值为 0。

                如果您确定没有人会出于任何其他原因将此属性设置为 0,那么您可以测试:

                if (e.CreatedBy == 0) 
                

                ...但是,如果 0 在另一种情况下是此属性的有效值,那么测试 0 将无济于事。同样,如果您将属性更改为可为空,那么您可以测试:

                if (e.CreatedBy == null) 
                

                ...根据您的原始设计,但如果有任何其他原因导致该属性可能设置为 null,那么您也不会发现它是否曾经被设置,只是最后一次设置,它被设置为空。

                如果你想真正知道值是否被设置,你需要在使用 setter 时安排其他事情发生,例如设置另一个标志。这是一个这样做的示例,其中 CreatedByHasBeenSet 属性为 false(bool 的默认值!),直到 CreatedBy 上的设置器被调用:

                    private int createdBy;
                
                    public int CreatedBy
                    {
                        get
                        {
                            return this.createdBy;
                        }
                
                        set
                        {
                            this.createdBy = value;
                            this.CreatedByHasBeenSet = true;
                        }
                    }
                
                    public bool CreatedByHasBeenSet { get; private set; }
                

                【讨论】:

                • 您好@Ramhound,被问到的问题是“我如何判断该值是否已设置?”我的观点是,即使使用 int?,您也无法判断它是否已设置,只能判断它已设置为什么 - null 只是变量的一个可能值。如果 0 不是要设置的此属性的有效值,则测试为零即可。
                • 我只是想让你改进你的答案。
                • 感谢您的反馈,已编辑答案以纳入您的建议
                猜你喜欢
                • 2011-09-05
                • 2014-12-07
                • 2011-01-11
                • 1970-01-01
                • 2016-03-09
                • 2021-07-21
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多