Que dois-je faire à propos de “Possible de comparer le type de valeur avec la valeur 'null'”?
Lors de l'écriture de cette méthode pour une mesure NUnit Contrainte.
private void AddMatchFailure<TExpected, TActual>(string failureName, TExpected expected, TActual actual)
{
_matchFailures.Add(
String.Format(MatchFailureFormat, failureName,
(expected == null) ? "null" : expected.ToString(),
(actual == null) ? "null" : actual.ToString()));
}
Resharper avertit que expected
et actual
pourrait être ValueType
objets.
par exemple TExpected est de type DateTime prévu == null;//mais DateTime est une struct.
Quelles sont les règles lorsque l'on compare un ValueType à null et comment dois-je écrire la méthode que sans restreindre les paramètres génériques par l'ajout d'une contrainte de classe?
Vous devez vous connecter pour publier un commentaire.
Ne pas modifier le code, il suffit de les ignorer l'avertissement. Si le paramètre type est un non nullable type de la valeur, la comparaison sera toujours voués à l'échec, et ça fait toujours appel
ToString()
à la place. Je ne sais pas si c'est réellement JITted loin, mais je ne serais pas surpris... et cela ne ressemble pas c'est la performance, le code critique quand même 🙂Je serais personnellement de laisser l'avertissement "sur", mais l'ignorer dans ce cas particulier - peut-être avec un commentaire.
Je pense que je suis tombé sur le même avertissement à quelques reprises lors de réimplanter LINQ to Objects.
Object.ReferenceEquals(objA, null)
qui est vraiment juste appelerobjA == objB
dans le .NET code source. Et, je suis sûr que ce sera JITted ou inline en quelque sorte. La bonne chose est que le message d'erreur disparaît cependant, et l'appel est toujours valide 🙂Si vous ne savez pas qu'ils seront les types de référence, alors vous pouvez dire
null
.null
.Nullable<T>
?null
pour un non nullable type de valeur. Il fait sens pour la comparaison de devenir une simple constantefalse
pour les types sansnull
. Et c'est probablement le comportement souhaité pour la Fpo code.T
est un non nullable le type de valeur est l'instance deNullable<T>
oùNullable<T>.HasValue
estfalse
(c'est à dire, il estnull
).DefaultStringForType
ne gère pas unNullable<T>
c'estnull
correctement. Et même, à part que l'OP du code est beaucoup plus propre que la vôtre.NullReferenceExceptions
et l'utilisation d'un"null"
chaîne à la place. Ce code sera néanmoins impression0
,false
ou d'autres valeurs par défaut, c'est plus compliqué, pas intuitif et pour ce que ça vaut, aussi lent que d'une simple comparaison avecnull
.Je suis en utilisant quelque chose comme cela pour vérifier la valeur null sur les types génériques:
default(int)
est 0, ce qui peut être valable et explicitement de la valeur. La vérification dedefault(T)
est tout à fait différente de la vérification de la valeur null.0.ToString()
à être appelé...Devrait le faire.
default(T)
donne la valeur par défaut pour ce type, pour les types de référence qui est nul pour d'autres, cela dépend. (Énumérations, c'est l'équivalent de(enumType)0
par exemple).