给定一个元组(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方法,因为语言已经提供了实现所需行为的必要工具.
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是仍然需要引用).
反向操作 - 将多个变量传递给构造函数 - 是:常规构造函数.请注意,您无法在任何地方传递"类似元组的东西" ,因为它没有名称 - 它不是本地的.