为何无Add方法的IReadOnlyCollection<T>可作为params参数使用?
关于IReadOnlyCollection作为params参数的疑问解答
为什么多参数传入能正常运行?
这是C#编译器的隐式转换和适配逻辑在起作用:
- 虽然C# 13的params collections特性提到,params可用于实现
IEnumerable<T>且有Add方法的类型,但当你用的是接口(比如IReadOnlyCollection<int>)时,编译器没法直接实例化这个接口。 - 这时候编译器会自动选择一个兼容的具体类型——也就是
int[](数组)。数组天然实现了IReadOnlyCollection<int>,而且编译器会把你传入的多个整数打包成int[]实例,再隐式转换为IReadOnlyCollection<int>传给方法。
为什么单个整数也能传入?
当你传单个整数时,编译器的处理逻辑是这样的:
- 首先检查能不能把
int直接转成IReadOnlyCollection<int>——显然不行,但params参数的规则允许另一种处理:如果单个参数没法直接转换为目标类型,编译器会自动把它包装成一个兼容的集合实例(这里还是int[],也就是创建一个只包含这个整数的数组),再转成IReadOnlyCollection<int>传入。
简单总结:不管你传单个还是多个整数,最终都是靠int[]这个“中间层”完成了对IReadOnlyCollection<int>类型params参数的适配。另外要注意,params collections里要求的“有Add方法”,是针对编译器用来构造集合的具体类型的,不是params修饰的目标类型——这里用的数组是通过固定长度初始化构建的,不需要Add方法,所以能正常工作。
内容的提问来源于stack exchange,提问作者Hr.Panahi
相关产品推荐
相关产品推荐

