我想比较以下内容:
if (e.CreatedBy == null)
但这给我一个错误说:
由于type的值,表达式的结果始终为“false” 'int'永远不会等于'int?'
类型的'null'
有人可以帮我告诉我如何检查CreatedBy的值是否尚未设置?请注意这里是CreatedBy的定义:
public int CreatedBy { get; set; }
答案 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; }