【问题标题】:Error in conditional operator条件运算符错误
【发布时间】:2017-07-25 15:36:36
【问题描述】:

我的代码运行良好

if (dt.Rows.Count < 0)
{
    DataRow row = dt.NewRow();

    foreach (DataColumn column in dt.Columns)
    {
        if (column.ColumnName == "CreatedDate")
        {
            row[column] = DateTime.MinValue;
        }
        else
        {
            row[column] = 0;
        }
    }

    dt.Rows.Add(row);

    DataColumn col = new DataColumn("Status", typeof(string));
    col.DefaultValue = "0";
    dt.Columns.Add(col);
}

return dt;

这个DataTable 有这些列具有提到的数据类型:

  • ID:内部
  • 全名:字符串
  • 用户名:字符串
  • 密码:字符串
  • user_email: 字符串
  • 角色:字符串
  • CreatedDate:日期时间

我在 web api 控制器中使用的这段代码。它以 json 格式从 SQL 查询返回数据

但是如果DataTable 是空的,那么为了防止在json 中返回一个空数组,我使用这个代码;如果DataTable 为空,则每个字段都将返回零。

现在我将这段代码转换成一行(三元运算符)如下:

DataRow row = dt.NewRow();

foreach (DataColumn column in dt.Columns)
{
    row[column] = (column.ColumnName == "CreatedDate") ? DateTime.MinValue : 0;
}

dt.Rows.Add(row);

DataColumn col = new DataColumn("Status", typeof(string));
col.DefaultValue = "0";
dt.Columns.Add(col);

return dt;

我也尝试了这两种方法:

row[column] = (column.DataType == DateTime) ? DateTime.MinValue : 0;

column.ColumnName == "CreatedDate" ? (row[column] = DateTime.MinValue) : (row[column] = 0);

但它们不起作用

错误是:

无法确定条件表达式的类型,因为 System.DatTime 和 int 之间没有隐式转换

如何解决?

【问题讨论】:

    标签: c#


    【解决方案1】:

    您的三元运算符根据情况返回两种不同类型的数据:如果为 true,则返回 DateTime,如果为 false,则返回 int0。您将结果分配到 DateTime 类型的列中 - 并且由于错误状态,没有从 intDateTime 的隐式转换:

    row[column] = (column.ColumnName == "CreatedDate") ? (object)DateTime.MinValue : 0;
    

    【讨论】:

    • 我认为你没有抓住重点。这不是运行时异常,而是编译器错误。
    • @IvanStoev - 我知道这是一个编译器错误 :) CreatedDate: Datetime 的列是 DateTime 并且分配是 int
    • 嗯,这就是为什么你写了 “作为 exception 状态”。解决方案在哪里? IMO 它需要object 演员,例如(object)DateTime.MinValue
    • @IvanStoev - true :) 写错字了。已更正。我无法建议该怎么做,因为它是由 OP 确定在 else 中使用的值
    • @IvanStoev - 好的 :) 理解我的错误 - 已更正。感谢您的解释。
    【解决方案2】:

    三元运算符?: 必须返回相同类型的值(或者第二个可以隐式转换为第一个)。

    您的尝试返回 DateTime(第一个)或 int(第二个),因此不存在转换。

    您需要通过多种方式中的一种来完成。

    使用if 对其进行编码(正如您已经完成的那样):

        if (column.ColumnName == "CreatedDate")
        {
            row[column] = DateTime.MinValue;
        }
        else
        {
            row[column] = 0;
        }
    

    由于row[column]object 类型,您可以将DateTime 转换为object

        row[column] = (column.ColumnName == "CreatedDate") ? (object)DateTime.MinValue : 0;
    

    或者,如果您想映射多个列,请执行以下操作:

    Dictionary<string, object> defaults = new Dictionary<string, object>()
    {
        { "CreatedDate", DateTime.MinValue },
        { "full_name", "n/a" },
        { "Id", default(int) },
    };
    
    foreach (DataColumn column in dt.Columns)
    {
        row[column] = defaults.ContainsKey(column.ColumnName) ? defaults[column.ColumnName] : 0;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-12-27
      • 2017-10-11
      • 1970-01-01
      • 1970-01-01
      • 2018-11-26
      • 1970-01-01
      • 2023-01-26
      相关资源
      最近更新 更多