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

数组并非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会把数组包装成一个实现了IList的“数组包装器”,但这个包装器不支持动态扩容操作,所以调用Add()就会报错。

如果你的方法需要支持添加元素,有两种解决办法:

  • 直接把参数类型改成List<string>,从源头限制只能传入可变集合;
  • 在方法内部先把传入的IList转成可变集合,比如:
    public static void IsThisBug(IList<string> array) {
        var mutableList = new List<string>(array);
        mutableList.Add("Hello");
    }
    

内容的提问来源于stack exchange,提问作者Demo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 18:07:03