如何检查输入字符与单词字符是否匹配?解决System.InvalidCastException异常
问题分析与修复
错误根源
你这段代码的核心问题有两个:
- 集合存储错误:
word.Add(currentWords[0].ToCharArray())是把整个字符数组当成单个元素塞进了ArrayList,导致word里存的是char[]类型对象,不是单个字符。后续用Convert.ToChar(word[i])试图把数组转成字符,直接触发类型转换异常。 - 逻辑冗余bug:每次调用
KeyCheck都会往word里重复添加字符数组,导致集合元素越来越多,完全偏离了检查单个字符的需求。
优化修复后的代码(推荐用泛型集合)
// 提前初始化目标字符集合,只在加载单词时赋值一次 private List<char> targetChars = new List<char>(); // 初始化目标单词的字符集合,比如在游戏加载/切换单词时调用 private void InitTargetWord() { targetChars.Clear(); targetChars.AddRange(currentWords[0].ToCharArray()); } private bool KeyCheck(char key) { if (targetChars.Contains(key)) { correct++; return true; } incorrect++; return false; }
如果你坚持用ArrayList(不推荐,泛型集合更安全高效)
private ArrayList word = new ArrayList(); private void InitTargetWord() { word.Clear(); // 把每个字符单独加入集合,而非整个数组 word.AddRange(currentWords[0].ToCharArray()); } private bool KeyCheck(char key) { foreach (char c in word) { if (c == key) { correct++; return true; } } incorrect++; return false; }
关键修复点
- 把目标单词的每个字符单独存入集合,而非存储整个字符数组。
- 集合仅初始化一次,避免每次检查都重复添加元素。
- 优先使用泛型集合(如
List<char>)替代ArrayList,消除不必要的类型转换风险。
内容的提问来源于stack exchange,提问作者no-one
相关产品推荐
相关产品推荐

