为何无法将StreamReader扩展方法的返回值与布尔值比较?
StreamReader扩展方法报错:Operator '==' cannot be applied to operands of type 'object' and 'bool'
别担心,这个错误很常见,我来帮你捋清楚问题出在哪以及怎么解决。
首先,这个错误的核心原因是:C#不允许直接把object类型的值和bool类型(比如true/false)用==比较——编译器没法确定这个object背后实际是不是bool类型,所以会抛出这个错误。
先猜一下你可能的错误写法
大概率你在扩展方法里错误地把某个返回object的结果(或者隐式转成object的值类型)直接和bool做了比较,比如类似这样:
public static bool CanReadData(this StreamReader reader) { object peekResult = reader.Peek(); // Peek()实际返回int,你却转成了object return peekResult == true; // 这里就会触发那个错误! }
或者更直接的,你可能误以为Peek()返回的是布尔值,直接写了:
return reader.Peek() == true; // Peek()返回int,不是bool,虽然不会直接报object和bool的错,但逻辑也不对
正确的扩展方法写法
要判断StreamReader是否还有可读取的数据,标准做法是用Peek()方法:它会返回下一个待读取字符的ASCII码,如果没有更多数据,就返回-1。所以正确的扩展方法应该是这样的:
public static bool CanReadData(this StreamReader reader) { // 先避免空引用异常 if (reader == null) throw new ArgumentNullException(nameof(reader)); // 判断是否还有可读取的字符 return reader.Peek() != -1; }
额外注意事项
- 空引用检查:一定要先判断传入的
StreamReader是否为null,不然调用方法时如果传了null会直接抛出空引用异常。 - 逻辑匹配需求:如果你的“可读取数据”不是指是否还有字符,而是指能否读取到特定类型/格式的数据,那你需要调整判断逻辑,但核心原则还是:不要直接把
object和bool用==比较,先把object转成对应的具体类型再做判断。
比如如果是要判断能否读取到有效的布尔值,那可以这样写:
public static bool CanReadBool(this StreamReader reader) { if (reader == null) throw new ArgumentNullException(nameof(reader)); string line = reader.ReadLine(); return bool.TryParse(line, out _); }
内容的提问来源于stack exchange,提问作者anon
相关产品推荐
相关产品推荐

