159 votes

Problème de type Nullable avec ? : opérateur conditionnel

Est-ce que quelqu'un pourrait expliquer pourquoi cela fonctionne en C# .NET 2.0 :

.. .mais ce n’est pas :

Cette dernière forme me donne une erreur de compilation « Type d’expression conditionnelle ne peut être déterminée parce qu’il n’y a pas de conversion implicite entre «  » et « System.DateTime ». »

Non pas que je ne peux pas utiliser l’ancien, mais le second type est plus cohérent avec le reste de mon code.

335voto

Stewart Johnson Points 7632

Cette question a été posée un tas de fois déjà. Le compilateur vous dit qu’il ne sait pas comment convertir dans un .

La solution est simple :

Notez que peut être écrit qui vous permettra d’économiser un tas de dactylographie.

20voto

FlySwat Points 61945

FYI (hors-sujet, mais astucieux et liés à des types nullables) nous avons un opérateur pratique seulement pour les types nullables, appelé l’opérateur null coalescent

Utilisé comme ceci :

8voto

MojoFilter Points 3730

C’est parce que pour un opérateur ternaire, les deux valeurs doivent être du même type.

3voto

newfurniturey Points 16866

Une autre solution similaire à accepté, c'est d'utiliser le C#' default mot-clé. Alors que définie à l'aide de generics, il est en fait applicable à tout type.

Exemple d'utilisation appliquée à la discussion de la question:

Nullable<DateTime> foo;
foo = true ? default(DateTime) : new DateTime(0);

Exemple d'utilisation avec la courante-réponse:

DateTime? foo;
foo = true ? default(DateTime) : new DateTime(0);

Aussi, en utilisant default, vous n'avez pas besoin de spécifier la variable nullable afin de lui attribuer un null de la valeur. Le compilateur s'auto-affecter la variable spécifique-type valeur par défaut (dans le cas d' DateTime, c'est - null) et aucune erreur ne sera rencontrée. Exemple:

DateTime foo;
foo = true ? default(DateTime) : new DateTime(0);

3voto

Mishax Points 1562

Je sais que cette question a été posée en 2008 et il est maintenant 5 ans plus tard, mais la réponse comme une réponse ne me satisfait pas. La vraie réponse est que DateTime est un struct, et comme une struct il n'est pas compatible avec la valeur null. Vous avez deux façons de résoudre ce:

La première est de rendre nul compatible avec DateTime (par exemple, la fonte de la valeur null DateTime? comme le monsieur avec 70 upvotes suggère, ou en fonte null pour Objet ou pour ValueType).

La deuxième est de faire de l'DateTime compatible avec la valeur null (par exemple, la fonte de DateTime DateTime?).

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