数组并非IList?为何可传入IList参数方法却调用Add报错?
为什么数组可以传给IList参数,但调用Add()会报错?
这不是bug,是.NET框架的刻意设计:
- .NET中的数组会隐式实现IList
接口 ,但这是个“受限实现”——数组的长度固定不变,所以IList里那些需要改变集合长度的方法(比如 Add()、Remove()、Insert()),数组在实现时直接抛出NotSupportedException。 - 这么设计的目的是让数组能兼容大量基于IList
的只读/元素修改场景(比如遍历数组、通过索引修改元素值),不用额外把数组转换成List ,节省内存和性能开销。
看你贴的代码:
using System.Collections.Generic; public class Program { public static void Main() { string[] thisIsArray = ["A", "B"]; IsThisBug(thisIsArray); } public static void IsThisBug(IList<string> array) { array.Add("Hello"); // 这里会抛出NotSupportedException } }
当你把string[]传给IList<string>参数时,CLR会把数组包装成一个实现了IListAdd()就会报错。
如果你的方法需要支持添加元素,有两种解决办法:
- 直接把参数类型改成
List<string>,从源头限制只能传入可变集合; - 在方法内部先把传入的IList
转成可变集合,比如: public static void IsThisBug(IList<string> array) { var mutableList = new List<string>(array); mutableList.Add("Hello"); }
内容的提问来源于stack exchange,提问作者Demo
相关产品推荐
相关产品推荐

