Quelqu'un pourrait-il expliquer pourquoi cela fonctionne en C # .NET 2.0:
Nullable<DateTime> foo;
if (true)
foo = null;
else
foo = new DateTime(0);
... mais ce n'est pas le cas:
Nullable<DateTime> foo;
foo = true ? null : new DateTime(0);
Cette dernière forme me donne une erreur de compilation "Le type d'expression conditionnelle ne peut pas être déterminé car il n'y a pas de conversion implicite entre '<null>' et 'System.DateTime'."
Non pas que je ne puisse pas utiliser l'ancien, mais le second style est plus cohérent avec le reste de mon code.
c#
generics
nullable
conditional-operator
Nick Gotch
la source
la source
Réponses:
Cette question a déjà été posée plusieurs fois. Le compilateur vous dit qu'il ne sait pas comment convertir
null
un fichierDateTime
.La solution est simple:
Notez que cela
Nullable<DateTime>
peut être écrit,DateTime?
ce qui vous évitera beaucoup de frappe.la source
<null>
etDateTime
et au lieu de trouver le type d'ancêtre commun, il essaie simplement de trouver une conversion entre eux. (Bit supplémentaire: C # reconnaît un<null>
type, c'est-à-dire le type de chaquenull
expression.)FYI (Offtopic, mais astucieux et lié aux types Nullable), nous avons un opérateur pratique juste pour les types Nullable appelé l'opérateur de fusion null
Utilisé comme ceci:
la source
C'est parce que dans un opérateur ternaire, les deux valeurs doivent se résoudre au même type.
la source
Je sais que cette question a été posée en 2008 et c'est maintenant 5 ans plus tard mais la réponse marquée comme réponse ne me satisfait pas. La vraie réponse est que DateTime est une structure et qu'en tant que structure, elle n'est pas compatible avec null. Vous avez deux façons de résoudre ce problème:
La première consiste à rendre null compatible avec DateTime (par exemple, convertir null en DateTime? Comme le suggère le gentleman avec 70 votes positifs, ou convertir null en Object ou ValueType).
La seconde est de rendre le DateTime compatible avec null (par exemple, transtyper DateTime en DateTime?).
la source
Une autre solution similaire à celle acceptée consiste à utiliser le
default
mot clé de C # . Bien que défini à l'aide de génériques, il est en fait applicable à n'importe quel type.Exemple d'utilisation appliquée à la question du PO:
Exemple d'utilisation avec la réponse acceptée actuelle:
De plus, en utilisant
default
, vous n'avez pas besoin de spécifier la variablenullable
pour lui attribuer unenull
valeur. Le compilateur attribuera automatiquement la valeur par défaut du type de variable spécifique et aucune erreur ne sera rencontrée. Exemple:la source
default(DateTime)
n'est pas vrai, n'est pas nul, c'est "1.1.0001 0:00:00
", le même quenew DateTime(0)
.null
, seulement qu'en utilisantdefault()
vous pouvez l'attribuer à unenullable
valeur (comme l'indique MSDN). Les exemples que je montre démontrent la polyvalence qu'il peut être utilisé avecNullable<DateTime>
,DateTime?
et tout simplementDateTime
. Si vous pensez que cela est incorrect, pouvez-vous fournir un PoC là où ils échouent?null
dans la variable, nondefault(DateTime)
, donc c'est au mieux trompeur. Ce n'est pas "polyvalent" comme vous le sous-entendez, puisque l'expression dans son ensemble a toujours le même type -DateTime
, et vous pouvez la remplacerdefault(DateTime)
parnew DateTime()
et elle fera la même chose. C'est peutdefault(DateTime?)
- être ce que vous vouliez dire, puisque c'est en fait égal ànull
.