268 votes

objet nullable doit avoir une valeur

Il y a paradoxe dans la description de l'exception: Nullable objet doit avoir une valeur (?!)

C'est le problème:

J'ai un DateTimeExtended classe, qui a

{
  DateTime? MyDataTime;
  int? otherdata;

}

et un constructeur

DateTimeExtended(DateTimeExtended myNewDT)
{
   this.MyDateTime = myNewDT.MyDateTime;
   this.otherdata = myNewDT.otherdata;
}

l'exécution de ce code

DateTimeExtended res = new DateTimeExtended(oldDTE);

jette un InvalidOperationException avec le message:

Nullable objet doit avoir une valeur.

myNewDT.MyDateTime.Value - est valide et contient un régulier DateTime objet.

Quelle est la signification de ce message et ce que je fais mal?

Notez que oldDTE n'est null. J'ai supprimé l' Value de myNewDT.MyDateTime mais la même exception est levée.

263voto

Yuliy Points 8854

Vous devez modifier la ligne this.MyDateTime = myNewDT.MyDateTime.Value; juste this.MyDateTime = myNewDT.MyDateTime;

L'exception que vous receviez a été jeté dans le .La valeur de la propriété de la Nullable DateTime, comme il est tenu de renvoyer un DateTime (puisque c'est ce que le contrat de .Valeur unis), mais il ne peut pas le faire car il n'y a pas DateTime de retour, de sorte qu'il déclenche une exception.

En général, c'est une mauvaise idée à l'aveuglette appel .Valeur sur un type nullable, sauf si vous avez une certaine connaissance préalable que cette variable DOIT contenir une valeur (c'est à dire par le biais d'un HasValue vérifier).

MODIFIER

Voici le code pour DateTimeExtended qui ne jetez pas une exception:

class DateTimeExtended
{
    public DateTime? MyDateTime;
    public int? otherdata;

    public DateTimeExtended() { }

    public DateTimeExtended(DateTimeExtended other)
    {
        this.MyDateTime = other.MyDateTime;
        this.otherdata = other.otherdata;
    }
}

Je l'ai testé comme ceci:

DateTimeExtended dt1 = new DateTimeExtended();
DateTimeExtended dt2 = new DateTimeExtended(dt1);

L'ajout de la .De valeur sur les autres.MyDateTime provoque une exception. Retrait il se débarrasse de l'exception. Je pense que vous cherchez au mauvais endroit.

8voto

Paul Creasey Points 15663

Essayez de supprimer la valeur.

2voto

Cecil Has a Name Points 3385

Attribuez les membres directement sans la partie .Value :

 DateTimeExtended(DateTimeExtended myNewDT)
{
   this.MyDateTime = myNewDT.MyDateTime;
   this.otherdata = myNewDT.otherdata;
}
 

2voto

Lee Points 63849

Dans ce cas, oldDTE est null, donc lorsque vous essayez d'accéder à oldDTE.Value, InvalidOperationException est levée car il n'y a pas de valeur. Dans votre exemple, vous pouvez simplement faire:

 this.MyDateTime = newDT.MyDateTime;
 

0voto

Pavel Radzivilovsky Points 11613

On dirait que oldDTE.MyDateTime était nul, donc le constructeur a essayé de prendre sa valeur - qui a jeté.

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