15e*_*153 10 c# c#-7.0 valuetuple
给定一个函数(string a, string b) F(),你可以解构它返回的元组:
var (a, b) = F();
(string c, string d) = F();
Run Code Online (Sandbox Code Playgroud)
或者你可以分配它:
var (a, b) e = F();
(string a, string b) f = F();
var g = F(); // One of these things is not like the others.
Run Code Online (Sandbox Code Playgroud)
类解构器的行为与第一种情况类似.给定一个类C有Deconstructor(out string a, out string b):
var c = new C();
var (h, i) = c;
(string j, string k) = c;
Run Code Online (Sandbox Code Playgroud)
但编译器不会使用解构函数将其隐式转换为元组:
// Cannot implicitly convert type 'C' to '(string a, string b)'
var (a, b) l = c;
Run Code Online (Sandbox Code Playgroud)
显然,您可以基于解构器机械地编写隐式转换:
public static implicit operator (string a, string b) (C c)
{
c.Deconstruct(out string a, out string b);
return (a, b);
}
Run Code Online (Sandbox Code Playgroud)
尽管解构和赋值情形之间的语法具有视觉上的相似性,但是为元组指定引用与将类解构为变量然后将它们放入新元组不同.但是,您可以隐式转换(int x, int y)为(double x, double y).值元组是一种语法 - 糖特性,它可以执行它看起来的样子,并且不介意实现细节.
如果我想到这一点,C#团队就会想到它,如果他们选择不为隐式转换添加"魔法"支持,他们有充分的理由1.
有没有一个积极的理由为什么自动进行隐式转换会是一个坏主意?
或者它是否被认为不足以证明成本合理的那些功能之一?
这是来自小提琴的代码:
public class Program
{
public static void Main()
{
(string a, string b) = F();
(string a, string b) ab = F();
Console.WriteLine($"a: {a} b: {b} ab: {ab}");
var c = new C();
(string d, string e) = c;
// Cannot implicitly convert type 'C' to '(string a, string b)'
(string a, string b) f = c;
Console.WriteLine($"d: {d} e: {e} f: {f}");
// Covariance
(object c, object d) g = F();
// Implicit conversion
(double x, double y) t = G();
}
public static (string a, string b) F()
=> ("A", "B");
public static (int x, int y) G()
=> (0, 1);
}
public class C
{
public String A = "A";
public String B = "B";
public void Deconstruct(out String a, out String b)
{
a = A;
b = B;
}
}
Run Code Online (Sandbox Code Playgroud)
1 C#团队可能并不比每个人都聪明,但我从来没有亏钱,打赌他们至少和我一样聪明.
(string a, string b) ab声明一个名为的元组类型的单个变量.这可以让你写,或不,或.(string a, string b)abab.aab.bab
(string a, string b) f = c;尝试将不相关的C类型转换为此元组类型.除非你写一个演员,否则就没有办法实现.
具体来说,顾名思义,解构只允许您分配变量; 它不允许您转换为不相关的类型.
在C#7发布之前,解构的行为就像隐式转换器一样,是(我,所以我在这里有偏见)所要求的.团队的反应是(正如我所读到的那样)它被要求离C#7版本太近而且实施时间太长,所以没有考虑.因为它现在将是一个突破性的变化,它不会发生.
请参阅" 允许解构和隐式运算符以支持解构和转换为元组类型 "roslyn repo问题,以便对此事进行实际讨论.
这是实现您要做的事情的一种方法:在您的代码示例中,而不是(string a, string b) f = c;使用(string a, string b) f = (_, _) = c;.
您还可以编写从您的类型到您需要的元组类型的用户定义转换.
| 归档时间: |
|
| 查看次数: |
1880 次 |
| 最近记录: |