C#7 带元组的输出变量

C#7 Out Variables with Tuples

当输出变量是 Tuple 时,是否可以使用 C#7 feature of out variables

我的确切情况是这样的:

private readonly Dictionary<int, (bool, DateTime)> _dictionary;

public void SomeMethod(int number)
{
    if (this._dictionary.TryGetValue(number, out (bool isTrue, DateTime timestamp)) // what is the correct syntax?
        // use isTrue and timestamp here
}

如果可能的话,我似乎找不到正确的语法。

澄清:我希望能够直接解构为 isTruetimestamp 而不必创建另一个变量。

考虑以下代码:

using System;
using System.Collections.Generic;

namespace ConsoleApp1 {
class Program {
    private static Dictionary<int, (bool, DateTime)> _dictionary;

    public static void SomeMethod(int number) {
        if (_dictionary.TryGetValue(number, out (bool isTrue, DateTime timestamp) booltime)) {
            Console.WriteLine($"Found it: {booltime.isTrue}, {booltime.timestamp}");
            }
        else {
            Console.WriteLine($"{number} Not Found");
            }
        }

    static void Main(string[] args) {
        _dictionary = new Dictionary<int, (bool, DateTime)>();
        _dictionary.Add(0, (true, DateTime.Now));
        SomeMethod(1);
        SomeMethod(0);
        }
    }
}

它将产生以下输出:

1 Not Found
Found it: True, 6/26/2018 4:56:59 PM

您可以通过在调用参数中定义变量或定义所需类型的单独变量来获取元组作为输出参数。您还可以像这样使用 var 关键字:

if (_dictionary.TryGetValue(number, out var booltime)) {
    Console.WriteLine($"Found it: {booltime.Item1}, {booltime.Item2}");
    }

请注意,如果这样做,您将没有命名的元组属性,您将不得不使用 Item1 和 Item2。

是的,你可以!但是您还试图解构元组,这在那里无法完成。

尝试这样的事情:

public void SomeMethod(int number)
{
    if (this._dictionary.TryGetValue(number, out var item))
    {
        var (isTrue, timestamp) = item;
    }
}

您可能想要(或应该)命名元组的值:

private readonly Dictionary<int, (bool isTrue, DateTime timestamp)> _dictionary;

然后您可以使用值名称:

public void SomeMethod(int number)
{
    if (this._dictionary.TryGetValue(number, out var item))
    {
        // use item.isTrue;
        // use item.timestamp;
    }
}