所以,首先。码: 我上课了:
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 (mo.StartDate.Value == null)
但它总是返回false。怎么不是空的?它甚至没有创建..
所以.. 如何检查是否未分配DateTime对象?
答案 0 :(得分:5)
试试这个:
if (mo.StartDate.GetValueOrDefault() != DateTime.MinValue)
{
// True - mo.StartDate has value
}
else
{
// False - mo.StartDate doesn't have value
}
答案 1 :(得分:2)
应该能够做到
mo.StartDate != null
而不是
mo.StartDate.Value != null
答案 2 :(得分:0)
使用该类运行最简单的测试(如您所示)会产生错误:
var mo = new Myobject();
Console.WriteLine(mo.StartDate.HasValue);
输出为假。
我在你的构造函数上放了一个断点(如果你有的话),确保没有其他任何东西被分配,并通过任何方法调用,以确保没有其他设置属性可能不会立即明显...
你可以发布更多代码吗?设置该属性的代码中必须存在某些内容。
答案 3 :(得分:0)
你检查null的方式很好,必须有其他东西来设置字段的值。
要找到设置字段的内容,您可以右键单击它,然后找到所有引用,然后扫描列表以查找任何分配。
如果失败了,您可以暂时将其更改为显式定义的属性并在set方法中设置断点,然后只要设置了值就执行将暂停,并且您可以查找调用堆栈。
答案 4 :(得分:0)
.HasValue
和==null
是检查是否为DateTime?
分配值的方法。你做得对。在其他地方可能存在.HasValue
始终返回true的问题。