Comment vérifier si un System.ValueTuple est par défaut? Exemple approximatif:
(string foo, string bar) MyMethod() => default;
// Later
var result = MyMethod();
if (result is default){ } // doesnt work
Je peux retourner une valeur par défaut dans MyMethod
en utilisant la syntaxe default
de C # 7.2. Je ne peux pas vérifier le cas par défaut? Voici ce que j'ai essayé:
result is default
result == default
result is default(string, string)
result == default(string, string)
Si vous voulez vraiment qu'il retourne default
, vous pouvez utiliser
result.Equals(default)
la méthode Equals
intégrée d'un ValueTuple
devrait fonctionner.
Depuis la valeur C # 7.3, les tuples prennent désormais en charge les comparaisons via ==
et !=
pleinement, ce qui signifie que vous pouvez désormais le faire
result == default
et cela devrait fonctionner de la même façon.
Il existe plusieurs façons de comparer les valeurs par défaut à un tuple de valeur:
[TestMethod]
public void Default()
{
(string foo, string bar) MyMethod() => default;
(string, string) x = default;
var result = MyMethod();
// These from your answer are not compilable
// Assert.IsFalse(x == default);
// Assert.IsFalse(x == default(string string));
// Assert.IsFalse(x is default);
// Assert.IsFalse(x is default(string string));
Assert.IsFalse(Equals(x, default));
Assert.IsFalse(Equals(result, default));
Assert.IsTrue(Equals(x, default((string, string))));
Assert.IsTrue(Equals(result, default((string, string))));
Assert.IsTrue(result.Equals(default));
Assert.IsTrue(x.Equals(default));
Assert.IsTrue(result.Equals(default((string, string))));
x.Equals(default((string, string)))
}
Un simple default
avant d'être utilisé dans une comparaison doit être réifié de son "pur" null
à une valeur Tuple avec des valeurs par défaut pour les membres.
Voici ce que j'ai sous le débogueur:
Il y a deux problèmes avec vos tentatives:
==
N'est défini sur les tuples (en C # 7.2)default((int, int))
Notez qu'un opérateur ==
Est ajouté aux tuples en C # 7.3. Ensuite, vous pouvez faire Tuple == default
(Voir exemple en direct ).
Depuis C # 7.3, les types de tuple prennent désormais en charge == et! =. Ainsi, votre code pourrait ressembler à ceci:
(string foo, string bar) MyMethod() => default;
// Later
var result = MyMethod();
if (result == default){ } // Works!
Voir https://docs.Microsoft.com/en-us/dotnet/csharp/tuples#equality-and-tuples