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

C#新手疑问:为何代码会触发运行时异常?

关于C# List调用AddRange引发运行时异常的疑问

代码示例

我刚开始学习C#语言,遇到了这个问题,无法理解为何答案是会发生运行时异常,提前感谢您的解答。

我尝试理解这段代码,根据我的认知,List可以存储指定类型的元素,本题中元素类型为string,通过AddRange方法添加元素,我了解到可以通过这种方式添加元素。


问题原因解析

核心问题出在**AddRange的参数类型与元素实际类型不匹配**,且这种不匹配在编译阶段无法被检测到,只能在运行时暴露:

List<string>.AddRange方法要求传入的参数是IEnumerable<string>,但如果传入的是非泛型集合(比如ArrayList)或者包含非string类型元素的泛型集合(比如List<object>),C#会尝试对集合中的每个元素做类型转换:

举个对应场景的代码示例:

List<string> strList = new List<string>();
ArrayList objCollection = new ArrayList();
objCollection.Add(123); // 这里添加了int类型的元素
strList.AddRange(objCollection);

ArrayList是弱类型集合,里面的元素都是object类型。当调用AddRange时,程序会尝试把每个object元素转换为string,但int类型无法直接转换为string,于是运行时就会抛出InvalidCastException(无效转换异常)。

如果是泛型集合的情况,比如传入List<object>且其中混有int、bool等非string元素,同样会因为类型转换失败触发运行时异常——因为List<object>可以隐式转为IEnumerable<object>,但List<string>期望的是IEnumerable<string>,此时逐个元素的转换失败就会报错。

总结:List<string>只接受string类型元素,若传入的集合包含非string元素,编译时可能因类型兼容(比如非泛型集合)不报错,但运行时转换失败就会抛出异常。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 20:51:02