C#7值元组/解构不对称

时间:2017-05-11 16:06:52

标签: c# c#-7.0 valuetuple

Fiddle here

给定函数(string a, string b) F(),你可以解构它返回的元组:

var (a, b) = F();

(string c, string d) = F();

或者你可以分配它:

var (a, b) e = F();

(string a, string b) f = F();

var g = F();  //  One of these things is not like the others.

类解构器的行为与第一种情况类似。给定C的{​​{1}}课程:

Deconstructor(out string a, out string b)

但编译器不会使用解构函数将其隐式转换为元组:

var c = new C();

var (h, i) = c;

(string j, string k) = c;

显然,您可以基于解构器机械地编写隐式转换:

//  Cannot implicitly convert type 'C' to '(string a, string b)'
var (a, b) l = c;

尽管解构和赋值情形之间的语法具有视觉上的相似性,但是为元组指定引用与将类解构为变量然后将它们放入新元组不同。但是,您可以将public static implicit operator (string a, string b) (C c) { c.Deconstruct(out string a, out string b); return (a, b); } 隐式转换为(int x, int y)。值元组是一种语法 - 糖特性,它可以执行它看起来的样子,并且不介意实现细节。

如果我想到这一点,C#团队就会想到它,如果他们选择不添加"魔法"支持隐式转换,他们有一个很好的理由 1

是否有一个积极的理由为什么自动进行隐式转换会是一个坏主意?

或者它是否被认为不足以证明成本合理?

以下是that fiddle的代码:

(double x, double y)

1 C#团队可能并不比每个人都聪明,但我从来没有输过钱,认为他们至少和我一样聪明。

1 个答案:

答案 0 :(得分:5)

以下是实现您要执行的操作的一种方法:在代码示例中,使用(string a, string b) f = c;代替(string a, string b) f = (_, _) = c;

您还可以编写从您的类型到您需要的元组类型的用户定义转换。