Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/google-sheets/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在c#9中使用记录作为元组参数_C#_Tuples_Record_C# 9.0 - Fatal编程技术网

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

如何在c#9中使用记录作为元组参数,c#,tuples,record,c#-9.0,C#,Tuples,Record,C# 9.0,假设有这样的记录 公共记录示例记录(int a、int b); 和一种方法 public int ExampleMethod((int a,int b)t) { 返回t.a+t.b; } 可以这样做以记录作为元组参数吗 var t=新的示例记录(a:1,b:2); 举例法(t); 您可以向记录类型添加隐式转换: public record ExampleRecord(int a, int b) { public static implicit operator ValueTuple&

假设有这样的记录

公共记录示例记录(int a、int b);
和一种方法

public int ExampleMethod((int a,int b)t)
{
返回t.a+t.b;
}
可以这样做以记录作为元组参数吗

var t=新的示例记录(a:1,b:2);
举例法(t);

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

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

您可以创建扩展方法。例如:

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);
var t = new ExampleRecord(a: 1, b: 2);
ExampleMethod(t.ToTuple());
var t = new ExampleRecord(a: 1, b: 2);
ExampleMethod((_, _) = t);

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

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


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

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

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

您可以创建扩展方法。例如:

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);
var t = new ExampleRecord(a: 1, b: 2);
ExampleMethod(t.ToTuple());
var t = new ExampleRecord(a: 1, b: 2);
ExampleMethod((_, _) = t);

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

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


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

不,恐怕没有。虽然记录可以解构,但这与将它们转换为元组不同——相反,它使用元组语法将记录解构为许多不同的变量。您为什么要这样做是有疑问的。要么使用
ValueTuple
,善待您的分配并接受复制。或者使用不可变记录,获取分配,并通过引用传递。两者兼而有之就像逃离马戏团加入孤儿院,恐怕没有。虽然记录可以解构,但这与将它们转换为元组不同——相反,它使用元组语法将记录解构为许多不同的变量。您为什么要这样做是有疑问的。要么使用
ValueTuple
,善待您的分配并接受复制。或者使用不可变记录,获取分配,并通过引用传递。两者兼而有之就像逃离马戏团加入孤儿院