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