Проверьте, является ли значение кортежа значением по умолчанию

Как проверить, является ли System.ValueTuple значением по умолчанию? Пример:

(string foo, string bar) MyMethod() => default;

// Later
var result = MyMethod();
if (result is default){ } // doesnt work

Я могу вернуть значение по умолчанию в MyMethod используя синтаксис по default для С# 7.2. Я не могу проверить ответ на вопрос по умолчанию? Это то, что я пробовал:

result is default
result == default
result is default(string, string)
result == default(string, string)

Ответ 1

Если вы действительно хотите сохранить default, вы можете использовать

result.Equals(default)

встроенный метод Equals в ValueTuple должен работать.

Начиная с С# 7.3, кортежи значений теперь также поддерживают сравнения через == и != Полностью. Это означает, что теперь вы также можете делать

result == default и он должен работать так же.

Ответ 2

Существует несколько способов сравнения значений по умолчанию с кортежем значений:

    [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)))
    }

Простой default перед его использованием в сравнении должен быть подтвержден с его "чистого" null до кортежа значений со значениями по умолчанию для членов.

Вот что у меня под отладчиком:

enter image description here

Ответ 3

У вас есть две проблемы:

  1. В кортежах нет оператора == (в С# 7.2)
  2. Чтобы получить значение по умолчанию для типа кортежа, вам необходимо в скобках правильно ввести тип: default((int, int))

Обратите внимание, что оператор # == добавляется в кортежи в С# 7.3. Затем вы можете выполнить tuple == default (см. Живой пример).

Ответ 4

Начиная с С# 7.3, кортежи теперь поддерживают == и! =. Таким образом, ваш код может выглядеть так:

(string foo, string bar) MyMethod() => default;

// Later
var result = MyMethod();
if (result == default){ } // Works!

См. Https://docs.microsoft.com/en-us/dotnet/csharp/tuples#equality-and-tuples.