迭代器方法报错:无法隐式转换匿名类型为值元组
错误原因及解决方案
错误原因
你的迭代器方法声明返回的是具名值元组类型IEnumerable<(string Department, TimeSpan From, TimeSpan To)>,但yield return语句里用new { ... }创建的是一个匿名类型。这两种类型是完全独立的CLR类型,C#不支持它们之间的隐式转换,因此编译器抛出类型不匹配的错误。
直白点说:你承诺返回值元组,但实际返回了另一种不相关的匿名类型,类型对不上。
修正代码
把匿名类型的创建语法改成值元组的创建语法即可,不需要new {}这类匿名类型语法:
private IEnumerable<(string Department, TimeSpan From, TimeSpan To)> ParseConfig() { var lines = this.config.Split(new[] { "\n", "\r", "\r\n" }, StringSplitOptions.None); foreach (var line in lines) { var values = line.Split(';'); if(values.Length < 3) { continue; } // 直接返回值元组实例,无需创建匿名类型 yield return (Department: values[0], From: TimeSpan.Parse(values[1]), To: TimeSpan.Parse(values[2])); // 也可以简化成不带字段名的形式(方法返回的元组已定义具名,编译器会自动匹配): // yield return (values[0], TimeSpan.Parse(values[1]), TimeSpan.Parse(values[2])); } }
补充说明
- 匿名类型是编译器自动生成的无显式名称的引用类型,而具名值元组是
ValueTuple结构体的具名形式,属于值类型,二者本质完全不同。 - 当方法声明返回值元组类型时,必须返回对应类型的实例,不能用其他类型替代。
内容的提问来源于stack exchange,提问作者BennoDual
相关产品推荐
相关产品推荐

