You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何无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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 10:27:41