【问题标题】:Why does IS check not work for datarow为什么 IS 检查不适用于数据行
【发布时间】:2013-02-08 17:23:09
【问题描述】:

我有一个数据行,其中一列中有一个整数。但是,以下代码不会评估为 true。我很难理解为什么。我错过了什么?

foreach (DataRow dr in dataset.Tables[0].Rows)
{
    //this evaluates as false, even when I have a valid castable INT value in the column (as an object).
    if (dr[3] is int)
    {
        if (Convert.ToInt32(dr[3]) == 3)
        {
            //do something with row

        }
        else if (Convert.ToInt32(dr[3]) == 4)
        {
            //do someting else with row

        }
    }
}

【问题讨论】:

  • 设置断点,看看是什么数据类型?它可以转换为 int 并不意味着它是一个 int。
  • 那不是演员,而是皈依者。它可能是一个字符串。
  • 也许这个question会帮助你
  • 另外,进行一次转换并与变量进行比较。也应该看看switch 声明。
  • 如果你运行dr[3].GetType().ToString(),你会得到什么?

标签: c#


【解决方案1】:

正如其他人所说,您可能有一个字符串可以转换为 int,但不能转换为 int。

试试这个:

int val;

if (Int32.TryParse(dr[3].ToString(), out val)) {

【讨论】:

  • 虽然这是一个正确的答案,但我很好奇为什么 OP 要检查 Tables[0].Columns[3] 是否是每一行的 int,因为表定义在期间不会改变执行。这真的是他想知道的吗,或者对于手头的问题有更好的解决方案?
  • 很可能该表包含不同类型的数据并且没有定义的数据类型。
  • 就像一个 int 表示一行,一个 datetime 表示另一行,一个小数表示下一行,都存储在 varchar 列中?那么这就是需要解决的问题,而不是解析。
  • 这对阿奎那很有用,谢谢。当然,一旦进入,打开 var 是个好主意,也谢谢 Dan-o。我对生成此数据表的数据库没有任何控制权,并且我想确保如果在本专栏中以某种方式将“三”传递给我,这段代码不会被拖垮。
猜你喜欢
  • 2018-04-03
  • 2023-04-01
  • 1970-01-01
  • 2016-04-14
  • 2015-02-05
相关资源
最近更新 更多