Есть ли способ заставить IsDate (Date) возвращаться как ложное? - PullRequest
3 голосов
/ 21 июля 2010

Я проверяю некоторый код на VB.net, и в объекте проверки они написали следующее

If Not IsDate(Entity.SelectedDate) Then
            ErrorList.Add(New CValidationError("MainReport", "Please select a weekend date"))

SelectedDate имеет тип Date.Мне кажется, что никогда не удастся достичь такого состояния.Это правда?

Ответы [ 6 ]

3 голосов
/ 21 июля 2010

Вот что я вижу в Отражатель :

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 вернул false, когда B является подклассом A (а это не так), вы можете все еще предположить, что это всегда будет возвращать true с DateTime, так как тип значения, не может быть унаследован.

Значит, ты в порядке.

Мое лучшее предположение состоит в том, что этот код первоначально назывался IsDate на String или Object, который не был строго типизирован; в какой-то момент кто-то должен был обновить свойство SelectedDate, чтобы оно было напечатано как Date, не удосужившись обновить этот код проверки.

1 голос
/ 21 июля 2010

IsDate всегда будет возвращать true для любого объекта, который может быть преобразован в дату: http://msdn.microsoft.com/en-us/library/00wf8zk9%28VS.80%29.aspx

Он даже будет возвращать true, если вы выполните

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 (date) всегда будет возвращать true.

Однако стоит дважды проверить, что IsDate ссылается на стандартную функцию VB и не является какой-то пользовательской функцией, написанной где-либо еще (кажется страннымчто текст ошибки проверки относится к датам выходных, поэтому это может быть пользовательская функция).Щелкните правой кнопкой мыши и выберите «перейти к определению», чтобы убедиться, что Visual Studio перейдет в нужное место.Если это тот из пространства имен Microsoft.VisualBasic, то я бы сказал, что он всегда будет возвращать true.

0 голосов
/ 21 июля 2010

Это действительно IsDate из пространства имен Microsoft.VisualBasic; сообщение об ошибке даты выходного дня фактически запрашивает дату окончания недели, обычно пятницы. Теперь ясно, что это всегда вернет истину; Спасибо всем за ресурсы и подтверждение.

0 голосов
/ 21 июля 2010

Похоже, что они проверяют дату выходных, так почему бы не проверить DateTime.DayOfWeek на субботу или воскресенье?

0 голосов
/ 21 июля 2010

Это никогда не произойдет с этой ошибкой. SelectedDate имеет тип Дата. Итак, вы проверите, что это свидание.

0 голосов
/ 21 июля 2010

Я не верю, что когда-либо удастся достичь этого состояния.SelectedDate может быть установлен только с помощью элемента управления календаря или обработчика события OnSelectionChanged.Даже в этом случае значение может быть установлено только на дату или на ноль.Может быть, это следует проверить, чтобы убедиться, что выбрано значение, отличное от Null.В противном случае, просто отмените чек.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...