给定函数(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#团队可能并不比每个人都聪明,但我从来没有输过钱,认为他们至少和我一样聪明。
答案 0 :(得分:5)
以下是实现您要执行的操作的一种方法:在代码示例中,使用(string a, string b) f = c;
代替(string a, string b) f = (_, _) = c;
。
您还可以编写从您的类型到您需要的元组类型的用户定义转换。