Попытка сопоставить «похожие» кортежи, возвращаемые из нескольких функций, в одну переменную

Скажем, есть библиотека с кодом такого вида:

 public class SomeLib
{
    public (bool WasOk, string Message) DoCheck(string fileName)
    {
        // do something here to check the file. 
        return (true, "all good");
    }

    public (bool WasOk, string Message) DoCheck(byte[] fileBytes)
    {
        // do something here to check the file as bytes 
        return (true, "all good");
    }
}

Код, использующий эту библиотеку, выглядит в таком виде:

    int option = 1;

    SomeLib lib = new SomeLib();

    if (option == 0)
    {
        var res1 = lib.DoCheck("hello");
        MessageBox.Show(res1.WasOk + res1.Message);
    }
    else
    {
        var res2 = lib.DoCheck(new byte[] { });
        MessageBox.Show(res2.WasOk + res2.Message);
    }

Что я надеялся сделать, так это сохранить возвращаемое значение из двух вызовов DoCheck в общую переменную. например.:

    int option = 1;

    SomeLib lib = new SomeLib();

    var res; // doesn't compile, obviously

    if (option == 0)
    {
        res = lib.DoCheck("hello");                
    }
    else
    {
        res = lib.DoCheck(new byte[] { });
    }

    MessageBox.Show(res.WasOk + res.Message);  // act on the result in the same way for both branches. 

Я надеюсь в этом есть смысл. Возможно ли то, что я пытаюсь сделать? Допустим, код в библиотеке изменить нельзя.

Формы c голосовым вводом в React с помощью Speechly
Формы c голосовым вводом в React с помощью Speechly
Пытались ли вы когда-нибудь заполнить веб-форму в области электронной коммерции, которая требует много кликов и выбора? Вас попросят заполнить дату,...
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Будучи разработчиком веб-приложений, легко впасть в заблуждение, считая, что приложение без JavaScript не имеет права на жизнь. Нам становится удобно...
Flatpickr: простой модуль календаря для вашего приложения на React
Flatpickr: простой модуль календаря для вашего приложения на React
Если вы ищете пакет для быстрой интеграции календаря с выбором даты в ваше приложения, то библиотека Flatpickr отлично справится с этой задачей....
В чем разница между Promise и Observable?
В чем разница между Promise и Observable?
Разберитесь в этом вопросе, и вы значительно повысите уровень своей компетенции.
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Клиент для URL-адресов, cURL, позволяет взаимодействовать с множеством различных серверов по множеству различных протоколов с синтаксисом URL.
Четыре эффективных способа центрирования блочных элементов в CSS
Четыре эффективных способа центрирования блочных элементов в CSS
У каждого из нас бывали случаи, когда нам нужно отцентрировать блочный элемент, но мы не знаем, как это сделать. Даже если мы реализуем какой-то...
3
0
31
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

var res не компилируется, потому что у него нет информации о типе. Если вы делаете оператор, который объявляет переменную, компилятор должен иметь возможность каким-то образом определить тип, либо с левой, либо с правой стороны:

StringBuilder sb = new StringBuilder(); //both sides, available from the dawn of time
var sb = new StringBuilder();           //for a long time
StringBuilder sb = new();               //more recently

Если правой стороны нет, то левая сторона должна иметь информацию о типе:

StringBuilder sb;

Таким образом, для вашего случая вам нужно поместить информацию о типе слева. Вы даже можете переименовать участников (но это не обязательно)

(bool AllGood, string Note) res;

(bool WasOk, string Message) res;

(bool, string) res;  //access the bool in res.Item1, string in res.Item2

Вы можете сделать это в одном с тройным:

var res = (option == 0) ? lib.DoCheck(hello) : lib.DoCheck(new byte[] { });

Оба ваших метода возвращают кортежи с одинаковыми именованными элементами, поэтому ваш res будет иметь res.WasOk и res.Message, поэтому он скомпилирован так, как будто это:

(bool WasOk, string Message) res = ...

Если ваши кортежи, выходящие из ваших методов, имеют разные имена, они все равно будут компилироваться, как если бы это было так:

(bool, string) res = ...

И вы все еще можете получить доступ к данным через Item1 и Item2


Если вы используете этот тройной подход, вы также можете разобрать кортеж, что также позволяет вам переименовывать:

var(allGood, note) = ... ? ... : ... ;

MessageBox.Show(note);

Вместо одной переменной кортежа, где вы говорите res.Whatever, это создало две переменные, как если бы вы сделали это:

var res = ... ? ... : ... ;
var allGood = res.WasOk;
var note = res.Message;

Множество вариантов работы с кортежами.

Неявно типизированные локальные переменные должны быть инициализированы

An implicitly typed local variable must be initialized with a value at the same time that it is declared. here

Чтобы исправить эту ошибку

Присвойте значение переменной или присвойте ей явный тип.

(bool AllGood, string Note) res;

Другие вопросы по теме