c # 7.3 ValueTuple - проверка по умолчанию после деструктуризации - PullRequest
0 голосов
/ 09 февраля 2019

У меня есть

(string name, int val) f(bool ok) {
   if (!ok) return default;
   return ('John', 5);
}

Затем я делаю где-то:

var result = f(true);
if (result==default) return false;
var (name, val) = result;
... do something with name & val

Я нахожу это запутанным и слишком многословным .. Я создаю result только для проверки по умолчанию - я не надеваюиначе это не нужно ... есть ли более элегантный способ проверки по умолчанию без использования промежуточной переменной result?

Я могу сделать:

var (name, val) = f(true);
if ((name, val)==default) return false;
... do something with name & val

но опять-таки это утомительноособенно если ValueTuple имеет множество аргументов ...

РЕДАКТИРОВАТЬ:

Теперь я понимаю, что приведенный выше код не только многословен, но что общий шаблон содержит ошибки - вы не можете использовать default какзаменить состояние ошибки с помощью ValueTuples, причина в том, что для некоторых ValueTuple - то есть (int, int) - невозможно отличить значение по умолчанию от другого действительного значения - то есть (0, 0) и т. д.

Ответы [ 4 ]

0 голосов
/ 10 февраля 2019

Я закончил тем, что сделал:

private (bool ok, string name, int val) F(bool ok) {
    if (!ok) return (false, "", 0);
    return (true, "John", 5);
}

var (ok, name, val) = F(true);
if (!ok) return;
.. continue
0 голосов
/ 09 февраля 2019

У языка нет более лаконичного способа добиться того, чего вы хотите

Однако, другой подход заключается в использовании Try Pattern

private static bool TryF(bool ok, out (string name, int val) result)
{
   if (!ok)
   {
      result = default;
      return false;
   }
   result =  ("John", 5);
   return true;
}

...


if (!TryF(false, out var result))
   return;

// continue
0 голосов
/ 09 февраля 2019

Вы можете вернуть обнуляемый кортеж.Это немного более элегантно, чем возвращать кортеж по умолчанию, но хуже, чем ответ TryXXX Майкла Рэндалла.

private static (string name, int val)? F(bool ok) {
    if (!ok) return null;
    return ("John", 5);
}

var result = F(true);
if (result == null)
    return;
var (name, val) = result.Value;
0 голосов
/ 09 февраля 2019

Вы можете использовать следующее.

var (name,val) = f(true);
if ((name, val) == default)
...