【发布时间】:2018-10-08 21:51:29
【问题描述】:
我想使用ValueTuple的命名功能如下:
IEnumerable<(string, char, int)> valueTuples = new(string, char, int)[]
{
("First", '1', 1),
("Second", '2', 2),
("Third", '3', 3)
};
var projection1 = valueTuples.Select(((string s, char c, int i) tuple) => tuple.i);
但它不会编译并带有不是很有帮助的错误消息。然而,这些都编译:
var projection2 = valueTuples.Select(tuple => tuple.Item1);
var projection3 = valueTuples.Select(((string, char, int) tuple) => tuple.Item1);
尝试更直接的方法,这不会编译但会出错 更有帮助的消息:
var projection4 = Enumerable.Select(
valueTuples, ((string s, char c, int i) tuple) => tuple.i);
这导致尝试这个,编译:
var projection5 = Enumerable.Select<(string, char, int), int>(
valueTuples, ((string s, char c, int i) tuple) => tuple.i);
最终激发了这一点,编译:
var projection6 = valueTuples.Select<(string, char, int), int>(
((string s, char c, int i) tuple) => tuple.i);
这是 IEnumerable 扩展方法的普遍问题吗? 看起来不是因为这样编译:
var filtered = valueTuples.Where(((string s, char c, int i) tuple) => tuple.i > 1);
为什么我必须求助于 projection6 语法才能让它工作?
【问题讨论】:
标签: c# ienumerable anonymous-methods valuetuple