有没有办法将元组重建为兼容类?

Edm*_*ola 21 .net c# c#-7.0

给定一个元组(int,string)v和一个类C {int,string},在C#7中,实现C的Deconstruct(out int k,out string v)将允许ff:

C c = new C();
(int k, string v) = c;
Run Code Online (Sandbox Code Playgroud)

但反过来似乎没有支持,因此元组可以"重建"到兼容的类:

(int k, string v) vt = (1, "one");
C c = vt;
Run Code Online (Sandbox Code Playgroud)

我认为如果C有一个"匹配"C的Deconstruct()参数的构造函数,它应该得到支持:

class C
{
    public C(int k, string v)
    ...
}
Run Code Online (Sandbox Code Playgroud)

可能吗?可用?计划?我似乎找不到任何关于它的东西.或者可能是"重建"的可重用代码/技巧?

InB*_*een 25

当然可以.只需实现一个隐式运算符:

public static implicit operator C((int, string) t) 
    => new C(t.Item1, t.Item2);
Run Code Online (Sandbox Code Playgroud)

不需要一些特殊的Reconstruct方法,因为语言已经提供了实现所需行为的必要工具.

  • @EdmundoMendiola我没跟着你.你*需要*来实现`Deconstruct`,它没有内置到*any*`ValueTuple`中.唯一的编译器支持是一个方便的语法,在相反的方向上不需要,因为你真的在处理一个元组和一个很好的旧的隐式转换,编译器完全理解它. (3认同)

Mar*_*ell 14

以下之间有一个非常微妙的区别:

(int, string) x = c; // tuple assignment
(int a, string b) x = c; // tuple assignment with member aliases
Run Code Online (Sandbox Code Playgroud)

(int a, string b) = c; // deconstruction
Run Code Online (Sandbox Code Playgroud)

重要的是你的代码既不是这些代码,也不会编译 - 但从上下文中可以清楚地看到你正在讨论解构语法,所以我假设是底层形式.

解构语法(在类似元组的表达式之后没有名称的语法)实际上并不创建元组.实际上,它需要配对中的名称:

(int a, string b) = c;
Run Code Online (Sandbox Code Playgroud)

要么:

var (a, b) = c;
Run Code Online (Sandbox Code Playgroud)

不是一个元组,但是方便的语法:

c.Deconstruct(out int a, out string b);
Run Code Online (Sandbox Code Playgroud)

所以:从来没有涉及元组(虽然奇怪的System.ValueTuple是仍然需要引用).

反向操作 - 将多个变量传递给构造函数 - 是:常规构造函数.请注意,您无法在任何地方传递"类似元组的东西" ,因为它没有名称 - 它不是本地的.