Проверьте, является ли значение кортежа значением по умолчанию
Как проверить, является ли 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
до кортежа значений со значениями по умолчанию для членов.
Вот что у меня под отладчиком:
Ответ 3
У вас есть две проблемы:
- В кортежах нет оператора
==
(в С# 7.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.