我正在审查VB.net中的一些代码,并在验证对象中编写了以下内容
If Not IsDate(Entity.SelectedDate) Then
ErrorList.Add(New CValidationError("MainReport", "Please select a weekend date"))
SelectedDate的类型为Date。在我看来,永远不可能达到这个条件。这是真的吗?
答案 0 :(得分:3)
以下是我在Reflector中看到的内容:
Public Shared Function IsDate(ByVal Expression As Object) As Boolean
Dim time As DateTime
If (Expression Is Nothing) Then
Return False
End If
If TypeOf Expression Is DateTime Then
Return True
End If
Dim str As String = TryCast(Expression,String)
Return ((Not str Is Nothing) AndAlso Conversions.TryParseDate(str, (time)))
End Function
现在,问题是:如果传递Date
(VB.NET的DateTime
值的关键字),这个方法是否会返回false?
否强>
If (Expression Is Nothing)
对于盒装值类型,永远不会为真。
If TypeOf Expression Is DateTime
如果方法明确传递给Date
,总是为真。
即使TypeOf A Is B
是B
的子类A
(它没有),DateTime
也返回false,您仍然认为这将始终返回true,因为IsDate
作为值类型,不能继承。
所以你很好。
我最好的猜测是,此代码最初在String
或Object
上调用了SelectedDate
,而且类型不强;在某些时候,某人必须更新Date
属性才能输入{{1}},而无需更新此验证码。
答案 1 :(得分:1)
对于任何可以转换为日期的对象,IsDate将始终返回true: http://msdn.microsoft.com/en-us/library/00wf8zk9%28VS.80%29.aspx
如果你这样做,它甚至会返回
dim myDate as Date
myDate = Nothing
IsDate(myDate)
http://social.msdn.microsoft.com/Forums/en-US/vbgeneral/thread/3f70ef9e-79d0-4c89-ac33-ea16829e8298说:
请注意Date是值类型, 因此,不是参考类型 将Nothing赋值给变量 键入Date将其设置为默认值 价值(参见Lars所说的)。
因此IsDate(日期)将始终返回true。
值得仔细检查,但IsDate是指标准VB函数,而不是其他地方编写的自定义函数(验证错误文本引用周末日期似乎很奇怪,因此它可能是自定义函数)。右键单击它并“转到定义”以确保并查看Visual Studio的位置。如果它是Microsoft.VisualBasic命名空间中的那个,那么我会说它总是会返回true。
答案 2 :(得分:0)
我不相信有可能遇到这种情况。 SelectedDate只能由日历控件或OnSelectionChanged事件处理程序设置。即使这样,该值也只能设置为日期或空值。也许这应该检查以确保选择的值是非空的。否则,完全放弃支票。
答案 3 :(得分:0)
永远不会出现那种错误。 SelectedDate的类型为Date。所以你要检查这是一个约会。
答案 4 :(得分:0)
看起来他们正在检查周末日期,为什么不查看星期六或星期日的DateTime.DayOfWeek?
答案 5 :(得分:0)
确实来自Microsoft.VisualBasic命名空间的IsDate;周末日期错误消息实际上是要求该周结束的日期,通常是星期五。现在似乎很清楚,这将永远回归真实;谢谢大家的资源和确认。