我想使用 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 语法才能让它工作?