【问题标题】:Why I can't compare the extension method's return value to a boolean?为什么我不能将扩展方法的返回值与布尔值进行比较?
【发布时间】:2018-08-01 07:08:45
【问题描述】:

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

我的扩展方法代码:

 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
  • 您的方法的返回类型设置为object。尽管您返回 true 和 false,但它们不是作为布尔值返回,而是作为对象返回。
  • C#使用CAMEL CASE?
  • 您的返回逻辑可以简化为:return sr.ReadLine() != null;
  • 不要这样做。你的方法有副作用。您丢弃了您读取的流的第一行。我感觉到了灾难!

标签: c# methods boolean streamreader


【解决方案1】:

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

另外,你的方法绝对是多余的,不需要,就这么简单:

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

阅读此Peek()

【讨论】:

    【解决方案2】:

    这里有一些问题。首先,您的方法返回类型object,您无法直接将其与类型bool 进行比较。就编译器“知道”而言,绝对没有理由相信比较是明智的 - 据它所知,您可能正在做类似 "bird" == true 的事情,这是没有意义的。

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

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

    首先,在风格上,如果你有一个布尔表达式,为什么不直接“直接”返回呢?这恰好在 (sr.ReadLine()) != nulltrue 时返回 true,而在表达式为 false 时返回 false

    其次,正如 cmets 中所指出的那样,这会“消耗”一行而不实际将其存储在任何地方,因此您实际上会“丢失”数据。 (您只需丢弃该行)。

    第三,这个方法的意义何在?您实际上所做的只是单行比较,因此根本没有理由使用这种方法。

    最后,用这一行:

    if (sr.isReady() == true)
    

    没有理由明确比较truefalse。你可以写

    if (sr.isReady())
    

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

    【讨论】:

      【解决方案3】:

      您将isReady() 函数定义为返回一个对象:

      public static object isReady(this StreamReader sr)
      

      让它返回一个布尔值:

      public static bool isReady(this StreamReader sr)
      

      【讨论】:

      • 你不觉得他的方法有问题吗?
      • OP 正在使用他们当前的方法丢失数据,而您的回答无助于解决这个问题。
      • 我必须同意 - 即使他们编译它,它也不会像 OP 认为的那样做,所以值得在 cmets 中指出这一点。
      • 该方法可能是“可疑的”,其他答案的所有建议都是好的和准确的。但话虽如此,这是唯一真正回答所提出的问题的答案。 +1
      猜你喜欢
      • 1970-01-01
      • 2020-06-04
      • 1970-01-01
      • 2011-11-04
      • 2017-04-22
      • 1970-01-01
      • 2011-09-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多