web-dev-qa-db-fra.com

Vérifiez si la valeur Tuple est par défaut

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)
21
nawfal

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.

23
Gibbon

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:

enter image description here

9
Kit

Il y a deux problèmes avec vos tentatives:

  1. Aucun opérateur == N'est défini sur les tuples (en C # 7.2)
  2. Pour obtenir une valeur par défaut pour un type de tuple, vous devez correctement mettre le type entre parenthèses: 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 ).

5
Julien Couvreur

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

2
phillhutt