为什么我不能将扩展方法的 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()) != null
是 true
和 false
恰好在表达式是 false
.
时
其次,正如评论中所指出的,这 "consumes" 一行实际上并没有将其存储在任何地方,因此您实际上会 "lose" 执行此操作的数据。 (您只需丢弃该行)。
第三,这个方法首先有什么意义?您实际上所做的只是一个 one-line 比较,因此根本没有理由使用此方法。
最后,这一行:
if (sr.isReady() == true)
没有理由明确地与 true
和 false
进行比较。你可以只写
if (sr.isReady())
(尽管,正如已经指出的那样,该方法首先是毫无意义的)。
您的方法很危险 - 它有副作用,您丢弃了完整的第一行数据。
另外,你的方法绝对多余,不需要,很简单:
var sr = new StreamReader(tcpClient.GetStream(), Encoding.ASCII);
if (sr.Peek() != -1)
{
//Do something
}
读这个Peek()
我尝试创建一个 扩展方法 来测试流读取器是否可以读取数据和 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()) != null
是 true
和 false
恰好在表达式是 false
.
其次,正如评论中所指出的,这 "consumes" 一行实际上并没有将其存储在任何地方,因此您实际上会 "lose" 执行此操作的数据。 (您只需丢弃该行)。
第三,这个方法首先有什么意义?您实际上所做的只是一个 one-line 比较,因此根本没有理由使用此方法。
最后,这一行:
if (sr.isReady() == true)
没有理由明确地与 true
和 false
进行比较。你可以只写
if (sr.isReady())
(尽管,正如已经指出的那样,该方法首先是毫无意义的)。
您的方法很危险 - 它有副作用,您丢弃了完整的第一行数据。
另外,你的方法绝对多余,不需要,很简单:
var sr = new StreamReader(tcpClient.GetStream(), Encoding.ASCII);
if (sr.Peek() != -1)
{
//Do something
}
读这个Peek()