C# LINQ返回类型不匹配求助:无法转换匿名类型为值元组
问题原因与解决方法
问题核心
你的方法返回类型声明的是值元组集合IEnumerable<(string upper, string lower)>,但实际生成的wordsUpperAndLower是匿名类型集合——这两种类型属于完全不同的类型体系,编译器无法完成隐式转换,因此抛出类型不匹配的错误。
修复方案
只需把匿名类型的创建替换为值元组的创建即可,有两种简洁写法:
写法一:值元组字面量语法(推荐)
直接在select中返回命名值元组,字段名和返回类型保持一致,可读性更强:
public static IEnumerable<(string upper, string lower)> SelectByCase() { string[] words = { "aPPLE", "BlUeBeRrY", "cHeRry" }; var wordsUpperAndLower = from s in words select (upper: s.ToUpperInvariant(), lower: s.ToLowerInvariant()); return wordsUpperAndLower; }
写法二:显式构造值元组
如果习惯传统构造方式,也可以用ValueTuple.Create方法:
public static IEnumerable<(string upper, string lower)> SelectByCase() { string[] words = { "aPPLE", "BlUeBeRrY", "cHeRry" }; var wordsUpperAndLower = from s in words select ValueTuple.Create(s.ToUpperInvariant(), s.ToLowerInvariant()); return wordsUpperAndLower; }
注:值元组的命名是可选的,但显式指定upper和lower能让代码逻辑更清晰,也避免因字段顺序错误导致的潜在问题。
内容的提问来源于stack exchange,提问作者Pavel.Shymko
相关产品推荐
相关产品推荐

