当它说'int'永远不等于'int'类型的'null'时,它是什么意思?

时间:2013-07-09 13:54:34

标签: c#

我想比较以下内容:

if (e.CreatedBy == null) 

但这给我一个错误说:

  

由于type的值,表达式的结果始终为“false”   'int'永远不会等于'int?'

类型的'null'

有人可以帮我告诉我如何检查CreatedBy的值是否尚未设置?请注意这里是CreatedBy的定义:

public int CreatedBy { get; set; }

10 个答案:

答案 0 :(得分:6)

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

答案 1 :(得分:5)

CreatedBy的类型为int,这是一种无法取值null的类型。

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

如果你想要做的是检测值是否为0,那么我认为我不需要告诉你如何做到这一点。如果您确实想要检测是否已设置该值,则需要保留bool标志并在第一次执行属性的setter时设置该标志。

答案 2 :(得分: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
}

答案 3 :(得分:2)

int是一个不能为null的值类型。如果要使值类型为可为空,则需要使用int?,这是创建Nullable对象的简便方法

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

答案 4 :(得分:2)

  

有人可以帮我告诉我如何检查CreatedBy的价值是否尚未设定?

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

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

从我链接到的文档:

  

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

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

public int? CreatedBy { get; set; }

上面的语法实际上只是一个简写:

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

答案 5 :(得分:1)

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

if (e.CreatedBy == 0) 

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

答案 6 :(得分:1)

您使用 int 而不是 nullable int 所以它不能为空?

答案 7 :(得分:1)

您可以按如下方式更改CreatedBy的定义:

public int? CreatedBy { get; set; }

他们可以进行以下检查

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

答案 8 :(得分:1)

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

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

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

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

public YourClass(){
     CreatedBy = -1;
}

public int CreatedBy { get; set; }

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

另一种选择是使用nullable of int,因为有些人已经消化,并检查null。这有一个缺点,即必须处理类型int?而不是处理该值的任何地方的“一般”int。这可能不是问题,但有时它会变得很烦人,特别是如果你将值传递给其他方法,类或其他什么..

答案 9 :(得分:0)

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

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

if (e.CreatedBy == 0) 

...但是,如果0是另一种情况下此属性的有效值,则测试0不会对您有所帮助。同样,您将属性更改为可为空,然后您可以测试:

if (e.CreatedBy == null) 

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

如果您想真正了解是否已设置该值,则需要安排在使用setter时发生其他事情,例如设置另一个标志。以下是一个完成此操作的示例,其中CreatedByHasBeenSet属性为false(默认值为bool!),直到调用CreatedBy上的setter为止:

    private int createdBy;

    public int CreatedBy
    {
        get
        {
            return this.createdBy;
        }

        set
        {
            this.createdBy = value;
            this.CreatedByHasBeenSet = true;
        }
    }

    public bool CreatedByHasBeenSet { get; private set; }