Que dois-je faire à propos de «comparaison possible de type de valeur avec« null »?

Lors de l’écriture de cette méthode pour une contrainte NUnit personnalisée.

private void AddMatchFailure(ssortingng failureName, TExpected expected, TActual actual) { _matchFailures.Add( Ssortingng.Format(MatchFailureFormat, failureName, (expected == null) ? "null" : expected.ToSsortingng(), (actual == null) ? "null" : actual.ToSsortingng())); } 

Resharper signale que actual objects expected et actual peuvent être des objects ValueType .

 Par exemple, TExpected est DateTime
    attendu == null; // mais DateTime est une structure.

Quelles sont les règles lorsque l’on compare un ValueType à null et comment dois-je écrire la méthode pour en tenir compte sans limiter les parameters génériques en ajoutant une contrainte de classe?

Ne changez pas le code – ignorez simplement l’avertissement. Si le paramètre type est un type de valeur non nullable, la comparaison échouera toujours et elle appellera toujours ToSsortingng() . Je ne sais pas si c’est en fait JITted away, mais je ne serais pas surpris … et cela ne sonne pas comme si c’était du code critique de performance de toute façon 🙂

Je laisserais personnellement l’avertissement “on”, mais l’ignore dans ce cas particulier – éventuellement avec un commentaire.

Je pense que je suis tombé sur le même avertissement à quelques resockets lors de la réimplémentation de LINQ to Objects.

Quelles sont les règles lorsque l’on compare un ValueType à null et comment dois-je écrire la méthode pour en tenir compte sans limiter les parameters génériques en ajoutant une contrainte de classe?

Si vous ne savez pas qu’ils seront des types de référence, alors vous pouvez dire

 private void AddMatchFailure( ssortingng failureName, TExpected expected, TActual actual ) { _matchFailures.Add( Ssortingng.Format(MatchFailureFormat, failureName, IsDefault(expected) ? DefaultSsortingngForType() : expected.ToSsortingng(), IsDefault(actual) ? DefaultSsortingngForType() : actual.ToSsortingng() ); } private bool IsDefault(T value) { if(typeof(T).IsValueType) { return default(T).Equals(value); } else { return Object.Equals(null, value); } } private ssortingng DefaultSsortingngForType() { if(typeof(T).IsValueType) { return default(T).ToSsortingng(); } else { return "null"; } } 

J’utilise quelque chose comme ça pour vérifier la valeur null sur les types génériques:

 if (Equals(result, Default(T))) 
 private void AddMatchFailure(ssortingng failureName, TExpected expected, TActual actual) { _matchFailures.Add( Ssortingng.Format(MatchFailureFormat, failureName, (expected == default(TExpected)) ? "null" : expected.ToSsortingng(), (actual == default(TActual)) ? "null" : actual.ToSsortingng())); } 

Devrait le faire

default(T) donne la valeur par défaut pour ce type, pour les types de référence nuls – pour d’autres, cela dépend. (Enums c’est l’équivalent de (enumType)0 par exemple).