C# List<String>调用RemoveAt方法报CS1503类型不匹配错误
问题根因
编译错误和你列表里存储的string类型没有任何关系,核心问题是List<T>.RemoveAt()方法的返回类型是void——它只负责删除指定索引位置的元素,不会返回被删除的元素。
你在第18行直接把RemoveAt(0)的调用结果传给Console.WriteLine(),相当于给WriteLine传了一个无实际值的void类型结果,而WriteLine没有任何重载支持接收void类型参数,才会触发CS1502、CS1503参数类型不匹配的错误。编译器根本不是识别不了元素类型,是你根本没有拿到被删除的元素。
修复方式
要实现“弹出头部元素并打印”的逻辑,需要先取出目标位置的元素,再执行删除操作,修正后的代码如下:
public void RemoveAndPrintAll() { while(listo.Count > 0) { // 先取索引0位置的头部元素 string item = listo[0]; // 移除头部元素 listo.RemoveAt(0); // 打印取出的元素 System.Console.WriteLine(item); } }
优化建议
- 如果你需要频繁执行头部弹出操作,不推荐用
List<T>:它的底层是连续数组实现,删除头部元素时必须把后续所有元素向前移动一位,数据量较大时性能很差。这种先进先出的场景更适合用Queue<T>(队列),它原生提供Dequeue()方法,直接弹出并返回队首元素,写法更简洁,性能也更高:
using System.Collections.Generic; public class foo { public Queue<string> listo; public foo() { listo = new Queue<string>(); listo.Enqueue("Apples"); listo.Enqueue("Oranges"); listo.Enqueue("Bananas"); RemoveAndPrintAll(); } public void RemoveAndPrintAll() { while(listo.Count > 0) { System.Console.WriteLine(listo.Dequeue()); } } }
- 日常写代码时可以多利用IDE的悬停提示:把鼠标放在方法名上就能直接看到方法的返回值、参数列表定义,悬停到
RemoveAt上你就能立刻看到它返回void,不会出现误以为它返回被删元素的问题。
内容的提问来源于stack exchange,提问作者Pete
相关产品推荐
相关产品推荐

