集合的目标类型推断
让目标类型决定集合的创建方式。
集合的目标类型推断 是 CoddyKit 上的免费 C# Academy 课时。 这是第 3 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 C# Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 C# Academy 课程共包含 4 节课。
什么是目标类型推断
目标类型推断是指编译器根据集合表达式的使用上下文,推断它应该构建什么,而不是根据右侧的显式类型进行推断。
using System;
int[] numbers = [1, 2, 3]; // target type is int[]
Console.WriteLine(numbers.GetType().Name); // Int32[]目标决定类型
同一个字面量会根据其流入的变量、参数或返回类型,变成不同的具体类型。
using System;
using System.Collections.Generic;
int[] asArray = [1, 2, 3];
List<int> asList = [1, 2, 3];
Console.WriteLine(asArray is int[]); // True
Console.WriteLine(asList is List<int>); // True方法调用中的目标类型推断
当方法参数是集合类型时,参数字面量会根据该参数进行目标类型推断。
using System;
using System.Collections.Generic;
static void Show(List<int> items) =>
Console.WriteLine(string.Join(",", items));
Show([10, 20, 30]); // target-typed to List<int>返回值中的目标类型推断
方法体可以返回一个不带类型的集合表达式;声明的返回类型会提供目标类型。
using System;
using System.Collections.Generic;
static List<string> Tags() => ["csharp", "dotnet", "ranges"];
Console.WriteLine(Tags().Count); // 3元素类型推断
元素类型来自目标类型。如果目标是 double[],整数文字会自动扩大为 double。
using System;
double[] values = [1, 2, 3]; // ints widen to double
Console.WriteLine(values[0] + 0.5); // 1.5以接口为目标
集合表达式可以以 IEnumerable<T>、IReadOnlyList<T> 或 ICollection<T> 等接口为目标;编译器会选择合适的具体类型。
using System;
using System.Collections.Generic;
IReadOnlyList<int> ro = [1, 2, 3];
Console.WriteLine(ro.Count); // 3三元表达式与目标类型推断
条件表达式的两个分支都可以是集合表达式,并分别根据共享的结果类型进行目标类型推断。
using System;
bool useDefaults = false;
int[] config = useDefaults ? [0, 0, 0] : [1, 2, 3];
Console.WriteLine(string.Join(",", config)); // 1,2,3var 不是目标类型
您不能写 var x = [1, 2, 3];,因为 var 不提供目标类型。请指定显式类型,或者在需要类型的上下文中使用该表达式。
using System;
// var x = [1, 2, 3]; // compile error: no target type
int[] x = [1, 2, 3]; // ok
Console.WriteLine(x.Length); // 3带展开元素的目标类型推断
目标类型推断与展开元素可以协同工作:目标类型决定最终的集合类型,而展开元素提供内容。
using System;
using System.Collections.Generic;
int[] src = [1, 2, 3];
List<int> copy = [..src]; // copies into a List<int>
Console.WriteLine(copy is List<int>); // True减少冗余
目标类型推断可以去除重复的类型名称。请比较冗余的旧写法和简洁的新写法。
using System;
// old: type repeated
int[] oldWay = new int[] { 1, 2, 3 };
// new: type only on the left
int[] newWay = [1, 2, 3];
Console.WriteLine(oldWay.Length == newWay.Length); // True综合运用
这里有一个接受任意只读集合的辅助方法,调用方可以自由传递根据目标类型推断的字面量。
using System;
using System.Collections.Generic;
static int Count(IReadOnlyCollection<int> c) => c.Count;
Console.WriteLine(Count([1, 2, 3, 4])); // 4快速检查
检验您对目标类型推断的掌握。
回顾
您学习了集合表达式如何进行目标类型推断。
- 目标类型(变量、参数或返回类型)决定集合的构造方式。
- 元素类型可以扩大,以匹配目标类型。
IReadOnlyList<T>等接口可以作为目标类型。var不能作为目标类型。
常见问题解答
「集合的目标类型推断」课时是免费的吗?
是的 — 「集合的目标类型推断」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 C# Academy 课程的其余内容,请升级到 CoddyKit PRO。 C# Academy 课程共包含 4 节课。
「集合的目标类型推断」这节课中我会学到什么?
让目标类型决定集合的创建方式。 你通过在浏览器中直接运行的动手代码来练习 C# Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 C# Academy 需要有经验吗?
无需任何先前经验。CoddyKit 上的 C# Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 3 节课,共 4 节。
「集合的目标类型推断」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 C# Academy 课中编写并运行代码吗?
能。每节 C# Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。