Обновление
Синтаксис в этом вопросе не так легко прочитать, поэтому я запутался. Деконструкция выполняется по мере необходимости, только после успешного совпадения. Этот пример Sharplab.io показывает, что это:
void f() {
if (MyFunc() is (false, var name1, var name2)) {
Console.WriteLine(name1);
return;
}
}
преобразуется в это в режиме выпуска:
private void f()
{
ValueTuple<bool, string, string> valueTuple = MyFunc();
if (!valueTuple.Item1)
{
string item = valueTuple.Item2;
Console.WriteLine(item);
}
}
Вместо попытки проверки на сбой проверьте для success и использовать переменные:
void f() {
if (MyFunc() is (true, var name1, var name2)) {
Console.WriteLine(name1);
}
}
Или расширить область видимости, используя переменную вне блока:
var (success,name1,name2)= MyFunc();
if (!success) return;
Console.WriteLine(name1);
Или использовать операторы switch:
switch(MyFunc()) {
case (false, _,):
return ;
case (success, var name1,var name2):
Console.WriteLine(name1);
break;
}
Вы также можете определять отдельные переменные и использовать тот факт, что присваивания являются выражениями, но это выглядит ужасно:
bool success;
string name1;
string name2;
if ( ((success,name1,name2)=MyFunc()) is (false,_,_)) {
return;
}
Console.WriteLine(name1);