90 votes

Pourquoi ne puis-je pas vérifier si la date et l'heure n'est rien

Dans vb.net, existe-t-il un moyen de définir une variable datetime sur "non définie". Et pourquoi est-il permis de fixer une date à Nothing et NON de vérifier si c'est Nothing, comme ceci:

 Dim d As DateTime = Nothing
Dim boolNotSet As Boolean = d Is Nothing 
 

Cela jette une erreur avec cette description:

 'Is' operator does not accept operands of type 'Date'. Operands must be reference or nullable types.
 

151voto

jeroenh Points 12777

C'est l'une des plus grandes sources de confusion avec VB.Net de l'OMI.

Nothing dans VB.Net est l'équivalent de default(T) en C#: la valeur par défaut pour le type donné.

  • Pour les types de valeur, c'est essentiellement l'équivalent du 'zéro': 0 pour Integer, False pour Boolean, DateTime.MinValue pour DateTime, ...
  • Pour les types référence, c'est l' null de la valeur (une référence qui se rapporte à rien).

L'énoncé d Is Nothing est donc équivalent à d Is DateTime.MinValue, ce qui n'est évidemment pas le compiler.

Solutions: comme d'autres l'ont dit

  • Utiliser DateTime? (c - Nullable(Of DateTime)). C'est ma solution préférée.
  • Ou utiliser d = DateTime.MinValue ou, de manière équivalente, d = Nothing

Dans le cadre du code d'origine, vous pouvez utiliser:

Dim d As DateTime? = Nothing
Dim boolNotSet As Boolean = d.HasValue

16voto

John M Gant Points 6147

DateTime est un type de valeur, c'est pourquoi il ne peut pas être null. Vous pouvez vérifier pour qu'il soit égal à DateTime.MinValue, ou vous pouvez utiliser Nullable(Of DateTime) à la place.

VB parfois "utilement" qui vous fait penser que c'est de faire quelque chose, il ne l'est pas. Lorsqu'il vous permet de fixer une Date pour Rien, c'est vraiment un réglage à une autre valeur, peut-être MinValue.

Voir cette question pour une discussion approfondie des types de valeur contre les types de référence.

5voto

Cheeso Points 87022

DateTime est un type de valeur , ce qui signifie qu'il a toujours une valeur.

C'est comme un entier - ça peut être 0, 1, ou moins que zéro, mais ça ne peut jamais être "rien".

Si vous voulez un DateTime pouvant prendre la valeur Nothing, utilisez un Nullable DateTime.

4voto

DavidRR Points 2211

Quelques exemples sur la façon de travailler avec nullable DateTime valeurs.

(Voir Nullable Types de Valeur (Visual Basic) pour plus d'.)

'
' An ordinary DateTime declaration. It is *not* nullable. Setting it to
' 'Nothing' actually results in a non-null value.
'
Dim d1 As DateTime = Nothing
Console.WriteLine(String.Format("d1 = [{0}]\n", d1))
' Output:  d1 = [1/1/0001 12:00:00 AM]

' Console.WriteLine(String.Format("d1 is Nothing? [{0}]\n", (d1 Is Nothing)))
'
'   Compilation error on above expression '(d1 Is Nothing)':
'
'      'Is' operator does not accept operands of type 'Date'.
'       Operands must be reference or nullable types.

'
' Three different but equivalent ways to declare a DateTime
' nullable:
'
Dim d2? As DateTime = Nothing
Console.WriteLine(String.Format("d2 = [{0}][{1}]\n", d2, (d2 Is Nothing)))
' Output:  d2 = [][True]

Dim d3 As DateTime? = Nothing
Console.WriteLine(String.Format("d3 = [{0}][{1}]\n", d3, (d3 Is Nothing)))
' Output:  d3 = [][True]

Dim d4 As Nullable(Of DateTime) = Nothing
Console.WriteLine(String.Format("d4 = [{0}][{1}]\n", d4, (d4 Is Nothing)))
' Output:  d4 = [][True]

Aussi, sur la façon de vérifier si une variable est null (à partir de Rien (Visual Basic)):

Lors de la vérification si une référence (ou nullable type de valeur) de la variable est null, ne pas utiliser = Nothing ou <> Nothing. Toujours utiliser Is Nothing ou IsNot Nothing.

1voto

sscheider Points 117

Dans tout langage de programmation, être prudent lors de l'utilisation de valeurs Null. L'exemple ci-dessus montre une autre question. Si vous utilisez un type de prendre la valeur null, ce qui signifie que les variables instanciées à partir de ce type peuvent contenir la valeur du Système.DBNull.Valeur; non pas qu'il a changé l'interprétation de la définition de la valeur par défaut à l'aide de "= Rien", ou que l'Objet de la valeur peut maintenant prendre en charge une référence null. Juste un avertissement... amusez-vous!

Vous pouvez créer une catégorie distincte contenant une valeur de type. Un objet créé à partir d'une telle classe est un type de référence, qui pourrait être attribué Rien. Un exemple:

Public Class DateTimeNullable
Private _value As DateTime

'properties
Public Property Value() As DateTime
    Get
        Return _value
    End Get
    Set(ByVal value As DateTime)
        _value = value
    End Set
End Property

'constructors
Public Sub New()
    Value = DateTime.MinValue
End Sub

Public Sub New(ByVal dt As DateTime)
    Value = dt
End Sub

'overridables
Public Overrides Function ToString() As String
    Return Value.ToString()
End Function

Fin De La Classe

"dans Main():

        Dim dtn As DateTimeNullable = Nothing
    Dim strTest1 As String = "Falied"
    Dim strTest2 As String = "Failed"
    If dtn Is Nothing Then strTest1 = "Succeeded"

    dtn = New DateTimeNullable(DateTime.Now)
    If dtn Is Nothing Then strTest2 = "Succeeded"

    Console.WriteLine("test1: " & strTest1)
    Console.WriteLine("test2: " & strTest2)
    Console.WriteLine(".ToString() = " & dtn.ToString())
    Console.WriteLine(".Value.ToString() = " & dtn.Value.ToString())

    Console.ReadKey()

    ' Output:
    'test1:  Succeeded()
    'test2:  Failed()
    '.ToString() = 4/10/2012 11:28:10 AM
    '.Value.ToString() = 4/10/2012 11:28:10 AM

Ensuite, vous pouvez choisir overridables pour lui faire faire ce dont vous avez besoin. Beaucoup de travail, mais si vous en avez vraiment besoin, vous pouvez le faire.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X