Les mathématiques avec les Énumérations (par exemple DayOfWeek) en C#
Pourquoi est-ce que le code suivant ne fonctionne pas:
endDate.AddDays(7-endDate.DayOfWeek);
Tout cela:
endDate.AddDays(0-endDate.DayOfWeek + 7);
?
(Par "ne fonctionne pas", je veux dire les résultats dans l'erreur de compilation suivante: "impossible de convertir de 'Système.DayOfWeek' à 'double'")
Pour certains intéressant pour l'analyse de compilateur bugs concernant cette fonctionnalité, voir: blogs.gotdotnet.com/ericlippert/archive/2006/03/28/... et blogs.gotdotnet.com/ericlippert/archive/2006/03/29/...
Pour ceux qui recherchent le Eric du blog posts, ils ont déménagé à blogs.msdn.com/b/ericlippert/archive/2006/03/28/... et blogs.msdn.com/b/ericlippert/archive/2006/03/29/...
Pour ceux qui recherchent le Eric du blog posts, ils ont déménagé à blogs.msdn.com/b/ericlippert/archive/2006/03/28/... et blogs.msdn.com/b/ericlippert/archive/2006/03/29/...
OriginalL'auteur nicolaskruchten | 2009-06-04
Vous devez vous connecter pour publier un commentaire.
De développer ce Lasse dit (ou plutôt, de le rendre un peu plus explicite).
Parce que 0 est convertible à un type Enum,
Et puisque vous pouvez soustraire un enum de l'autre et d'obtenir un nombre entier de différence:
Ainsi, depuis le résultat de la soustraction est un int, vous pouvez ensuite ajouter 7.
Donc, si le lundi de la valeur d'Enum est de 1
Cependant, vous ne pouvez pas faire l'inverse.
parce que le type de résultat du calcul est la personne à charge sur le côté gauche. Ainsi, tandis que 0 - date de fin.DayOfWeek résultats dans un entier, endDate.DayOfWeek - 0 résultats dans un enum DayOfWeek.
Plus intéressant, vous pouvez utiliser ce côté-effet pour obtenir la valeur de l'enum sans casting, bien que je ne considère pas cela hackish et déroutant... donc à éviter.
OriginalL'auteur Erik Funkenbusch
C'est très intéressant. La bonne façon de le faire est:
Mais, votre question n'est pas une solution, mais une raison pour le comportement. Il a quelque chose à voir avec la façon dont le compilateur traite d'un zéro. La ligne échoue si pas de zéro, alors que les deux lignes de travail si un zéro est présent.
OriginalL'auteur John Fisher
Vous pouvez soustraire deux valeurs enum pour obtenir leur valeur entière différence:
Imprimé 3.
Mais vous ne pouvez pas ajouter, sans doute, n'a aucun sens.
Dans le cas de "0", 0 est auto-convertibles à tous les types enum, donc, fondamentalement, "0 - enumvalue" signifie la même chose que "(enumtype)0 - enumvalue", qui fonctionne de nouveau.
OriginalL'auteur Lasse Vågsæther Karlsen