如何在 C# 9 中使用记录作为元组参数

how to work with record as tuple parameter in c# 9

假设有这样一条记录

public record ExampleRecord(int a, int b);

和一个方法

public int ExampleMethod((int a, int b) t)
{
    return t.a + t.b;
}

是否可以像这样将记录用作元组参数?

var t = new ExampleRecord(a: 1, b: 2);
ExampleMethod(t);

您可以向您的记录类型添加隐式转换:

public record ExampleRecord(int a, int b)
{
    public static implicit operator ValueTuple<int, int> (ExampleRecord record)
    {
        return (record.a, record.b);
    }
}

这样使用:

var t = new ExampleRecord(a: 1, b: 2);
ExampleMethod(t);

您可以制作扩展方法。例如:

public static class ExampleRecordExtensions
{
    public static (int, int) ToTuple(this ExampleRecord record)
    {
        return (record.a, record.b);
    }
}

这样使用:

var t = new ExampleRecord(a: 1, b: 2);
ExampleMethod(t.ToTuple());

或者你可以使用解构。像这样使用:

var t = new ExampleRecord(a: 1, b: 2);
ExampleMethod((_, _) = t);

我提醒你,记录类型是类。这些元组是值类型 (ValueTuple)。这也意味着您从记录类型创建的元组将始终是数据的副本。