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

我刚开始学习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

