3

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

if (e.CreatedBy == null) 

但这给了我一个错误:

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

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

public int CreatedBy { get; set; }
4

10 回答 10

6

的类型CreatedByint不能取值的类型null

从您目前拥有的情况来看,无法检测是否CreatedBy已设置。假设其默认值为0。然后将该值设置为1,然后再设置为0。现在,您如何区分当前0未修改的原始版本0

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

于 2013-07-09T13:56:27.810 回答
6

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

于 2013-07-09T13:57:46.597 回答
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
}
于 2013-07-09T13:58:03.607 回答
2

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

Nullable<int> myNullable = new Nullable<int>();
于 2013-07-09T13:56:42.290 回答
2

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

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

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

从我链接到的文档中:

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

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

public int? CreatedBy { get; set; }

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

public Nullable<int> CreatedBy { get; set; }
于 2013-07-09T13:57:07.080 回答
1

因为 int 的默认值是 0 而不是 null。e.CreatedBy永远不会有null更好的价值是将它与 0 进行比较。

if (e.CreatedBy == 0) 

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

于 2013-07-09T13:55:15.147 回答
1

好吧,您使用的是int not nullable int所以它永远不能为空?

于 2013-07-09T13:56:01.170 回答
1

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

public int? CreatedBy { get; set; }

他们可以进行以下检查

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

于 2013-07-09T14:01:59.773 回答
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。这可能不是问题,但有时会很烦人,尤其是当您将值传递给其他方法、类或其他任何东西时。

于 2013-07-09T14:12:54.820 回答
0

要回答您的问题,您无法检查该值是否已设置,您只能检查它现在具有的值。任何属性在初始化时都会有一个“默认”值。对于大多数类型(包括 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; }
于 2013-07-09T13:59:46.760 回答