为什么我不能将扩展方法的 return 值与布尔值进行比较?

Why I can't compare the extension method's return value to a boolean?

我尝试创建一个 扩展方法 来测试流读取器是否可以读取数据和 return 一个 布尔值

我的扩展方法代码:

 using System.IO;

    namespace ExtensionMethods
    {
        public static class StreamReaderExtension
        {
            public static object isReady(this StreamReader sr)
            {
                if ((sr.ReadLine()) != null)
                {
                    return true;
                } else
                {
                    return false;
                }
            }
        }

    }

我想如下使用:

StreamReader sr = new StreamReader(tcpClient.GetStream(), Encoding.ASCII);
if (sr.isReady() == true)
{
//Do something
}

但是 Visual Studio 告诉我这个错误消息:运算符 '==' 不能应用于 'object' 和 'bool'

类型的操作数

我错过了什么?

抱歉英语不好。

您将 isReady() 函数定义为 return 对象:

public static object isReady(this StreamReader sr)

用 return 布尔值代替:

public static bool isReady(this StreamReader sr)

你这里有一些问题。首先,您的方法是 returning type object,您不能直接将其与 type bool 进行比较。就编译器 "knows," 而言,绝对没有理由相信比较是明智的 - 就其所知,你可能会做类似 "bird" == true 的事情,这毫无意义。

其次,您的方法即使在编译后也不会像您认为的那样工作:

        public static object isReady(this StreamReader sr)
        {
            if ((sr.ReadLine()) != null)
            {
                return true;
            } else
            {
                return false;
            }
        }

首先,从风格上讲,如果您有一个布尔表达式,为什么不只是 return 而 "directly"?这 returns true 恰好在 (sr.ReadLine()) != nulltruefalse 恰好在表达式是 false.

其次,正如评论中所指出的,这 "consumes" 一行实际上并没有将其存储在任何地方,因此您实际上会 "lose" 执行此操作的数据。 (您只需丢弃该行)。

第三,这个方法首先有什么意义?您实际上所做的只是一个 one-line 比较,因此根本没有理由使用此方法。

最后,这一行:

if (sr.isReady() == true)

没有理由明确地与 truefalse 进行比较。你可以只写

if (sr.isReady())

(尽管,正如已经指出的那样,该方法首先是毫无意义的)。

您的方法很危险 - 它有副作用,您丢弃了完整的第一行数据。

另外,你的方法绝对多余,不需要,很简单:

var sr = new StreamReader(tcpClient.GetStream(), Encoding.ASCII);
if (sr.Peek() != -1)
{
    //Do something
}

读这个Peek()