7

我正在将大量代码从 VB.net 转换为 c#,这是我认为在转换过程中出现的另一个问题。

if (sRow.Cells[1].Value == true)
    Worked = "X";
else if (sRow.Cells[2].Value == true)
    Vacation = "X";
else if (sRow.Cells[3].Value == true)
    Sick = "X";
else if (sRow.Cells[4].Value == true)
    Holiday = "X";

在每个 if / else / else if 行上,它都会给我这个错误。我敢肯定我错过了一些会迫使我做傻事的东西......

错误 7 运算符“==”不能应用于“对象”和“布尔”类型的操作数

4

4 回答 4

11

你确定这些值是 typebool吗?

如果是这样,只需显式转换:

if ((bool)sRow.Cells[1].Value)
{
    Worked = "X";
}
else if ((bool)sRow.Cells[2].Value)
{
    Vacation = "X";
}
else if (sRow.Cells[3].Value)
{
    Sick = "X";
}
else if ((bool)sRow.Cells[4].Value)
{
    Holiday = "X";
}
于 2012-08-14T22:47:07.530 回答
5

我假设这是一个 DataRow 的单元格,其值为 type object。您不能使用==运算符将​​对象与布尔值进行比较。

所以你应该使用强类型Field扩展DataRow

if(sRow.Field<bool>(1))
    // ...
于 2012-08-14T22:50:58.847 回答
2

我不是if (x == true)一般的粉丝,但在认知负荷方面使用if ((bool)sRow.Cells[1].Value)orif (Convert.ToBoolean(sRow.Cells[1].Value))似乎相当不透明。

这是一个功能性的替代方案:

if (true.Equals(sRow.Cells[1].Value))
    Worked = "X";
else if (true.Equals(sRow.Cells[2].Value))
    Vacation = "X";
else if (true.Equals(sRow.Cells[3].Value))
    Sick = "X";
else if (true.Equals(sRow.Cells[4].Value))
    Holiday = "X";

编辑:反转比较以支持空值。

显然存在装箱成本,但如果代码不是特别迭代,它就不会引人注目。

有些人也被尤达的条件推迟了。

但是,DBNull 的转换/转换失败,而这种方法有效:

object x = DBNull.Value;
if (true.Equals(x)); // False
if (Convert.ToBoolean(x)); // InvalidCastException: Object cannot be cast from DBNull to other types.
if ((bool)x); // InvalidCastException: Specified cast is not valid.
于 2014-10-29T15:15:43.060 回答
1

错误 7 运算符“==”不能应用于“对象”和“布尔”类型的操作数

该错误告诉您:

运算符“==”不能应用于“object”和“bool”类型的操作数

Value是 type object,所以如果你想以这种方式比较它们,你将需要转换它。

因此,请确保Value' 的基础类型实际上是布尔值,然后...将显式比较转储为真或假。这是有争议的和风格的,但严重多余和不必要的。你会说“如果真等于真那么……”吗? 不,可能(希望)不是。

于 2012-08-14T22:46:25.120 回答