所以,首先。代码:我有一门课:
public class Myobject
{
public string Code { get; set; }
public DateTime? StartDate { get; set; }
}
这是一个非常简单的来源:
MyObject mo = new MyObject();
mo.Code= "sth";
// NO action on StartDate property!
if (mo.StartDate.HasValue)
{
sc.Parameters.Add(new SqlParameter("@inStartDate", mo.StartDate.Value));
}
else
{
sc.Parameters.Add(new SqlParameter("@inStartDate", DBNull.Value));
}
简单的"if"-Sql Server 2008,在获取null Datetime时抛出错误(它必须是DBNull.Value(所以我想先检查它,然后传递正确的值或DBNull。
我的问题是,这个"if"总是重试true!为什么?
也尝试过:
if (mo.StartDate.Value == null)
但它总是返回false。为什么它不是null?它甚至还没有被创造出来。。
所以如何检查DateTime对象是否未分配
试试这个:
if (mo.StartDate.GetValueOrDefault() != DateTime.MinValue)
{
// True - mo.StartDate has value
}
else
{
// False - mo.StartDate doesn't have value
}
应该只能进行
mo.StartDate != null
而不是
mo.StartDate.Value != null
使用该类运行最简单的测试(如您所示(会产生false:
var mo = new Myobject();
Console.WriteLine(mo.StartDate.HasValue);
输出为False。
我会在你的构造函数上设置一个断点(如果你有断点的话(,确保没有其他东西被赋值,并遍历沿途调用的任何方法,以确保没有其他任何东西设置可能不会立即明显的属性。。。
也许你能发布更多的代码吗?设置属性的代码中一定有未发布的内容。
.HasValue
和==null
是检查是否为DateTime?
赋值的方法。你做得对。其他地方可能存在.HasValue
总是返回true的问题。
检查null的方式很好,必须有其他东西在设置字段的值。
要找到设置字段的内容,您可以右键单击它,然后查找所有引用,然后扫描列表中的任何分配。
如果失败,您可以将其临时更改为显式定义的属性,并在set方法中设置断点,然后每当设置值时,执行就会暂停,您可以查找调用堆栈。