条件运算符出错

时间:2017-07-25 05:59:03

标签: c#

我的代码工作正常

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:Int
  • full_name:string
  • user_name:string
  • 密码:字符串
  • user_email:string
  • role:string
  • CreatedDate:Datetime

我在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

之间没有隐式转换

如何解决?

2 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分: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;
}