【问题标题】:How to check null or datetime value using ternary operator?如何使用三元运算符检查空值或日期时间值?
【发布时间】:2013-09-20 05:30:27
【问题描述】:

我想在 c# 中使用三元运算符检查传递的值是空值还是日期时间值?

我试过这样

fromDate == null ? null : Convert.ToDateTime(fromDate)

出现错误:

type of conditional expression cannot be determined

我想检查变量fromDate 是否为空或具有日期时间值?

变量 fromDate 来自查询字符串和字符串类型。

【问题讨论】:

  • TryParseExact 有什么问题?
  • 你知道日期时间格式吗?
  • 您要分配的变量的数据类型需要为 Nullable 并将 null 转换为 Nullable DateTime 类型。从数据库中读取可为空的日期时,我们通常会执行以下操作; DateTime? myDate = rdr.IsDBNull(ADDRESSENDDATE_ORDINAL) ? (DateTime?)null : rdr.GetDateTime(ADDRESSENDDATE_ORDINAL); 你需要做类似的事情。
  • 什么是fromDate?是字符串还是日期时间?
  • 您可能想要使用默认值(日期时间)。检查我的答案。

标签: c# asp.net ternary-operator


【解决方案1】:

来自?: Operator

first_expression 和 second_expression 的类型必须相同,或者必须存在从一种类型到另一种类型的隐式转换。

condition ? first_expression : second_expression;

Convert.ToDateTime 返回DateTime 并且nullDateTime 之间没有隐式转换条件运算符是一个表达式,需要返回类型。

一个选项对我来说似乎是合乎逻辑的,使用DateTime.TryParse(返回boolean)作为第一个表达式并使用另一个布尔值(truefalse)作为第二个表达式Damiths' answer 似乎合乎逻辑。

或者,您可以使用可空的 DateTime,例如 DateTime?

DateTime? foo;

if(foo.HasValue)
{
   //Nullable DateTime has a value..
}

【讨论】:

    【解决方案2】:

    如果您有 fromDate 的字符串值,请执行以下操作

    DateTime dt;
    
    bool isValidDate =  String.IsNullOrEmpty(fromDate) ? false : DateTime.TryParse(fromDate, out dt); 
    

    如果您知道日期时间格式/格式,您的输入最好使用DateTime.TryParseExact 方法

    如果fromDate是DateTime,那么简单你可以检查如下

    fromDate.HasValue
    

    你不需要?: Operator

    【讨论】:

      【解决方案3】:

      问题是 Convert.ToDateTime(fromDate) 是 DateTime 类型,它不能接受空值,这就是为什么这段代码不能以这种形式工作的原因。你有两个选择要做。如果出现以下情况,请将其更改为常规:

      if(fromDate != null)
      {
              Convert.ToDateTime(fromDate)
      }
      

      或将 DateTime 转换为可为空的 DateTime:

          fromDate == null ? null : (DateTime?)Convert.ToDateTime(fromDate)
      

      C# 中的三元运算符需要两个值的类型相同,这在 here 中进行了解释。

      【讨论】:

        【解决方案4】:
        romDate == null ? null : Convert.ToDateTime(fromDate)
        

        nullConvert.ToDateTime(fromDate) 没有通用类型。编译器必须能够将条件运算符中的两个表达式转换为相同的类型。

        【讨论】:

        • 需要检查相同的变量并将日期时间转换为该变量吗?为什么使用 2 个不同的变量?请解释
        【解决方案5】:

        希望对你有帮助

           string format = "ddd dd MMM h:mm tt yyyy";
            DateTime dateTime;
        
            fromDate=(DateTime.TryParseExact(fromDate, format, CultureInfo.InvariantCulture,
                DateTimeStyles.None, out dateTime))?dateTime:null;
        

        【讨论】:

          【解决方案6】:

          您必须使用 String.IsNullOrEmpty 来检查 fromDate 是否为 null,如下所示:

          DateTime? date = String.IsNullOrEmpty(fromDte) ? null : (DateTime?)Convert.ToDateTime(fromDate)
          

          【讨论】:

          • IsNullOrEmpty 返回一个布尔值,正如哈姆雷特所说,这不是问题
          • 为什么变量 fromDte , fromDate 不同?
          • DateTime不能为空值的问题,必须使用可空的DateTime
          【解决方案7】:

          看起来主要问题是您试图将null 分配给DateTime

          DateTime 是一个结构而不是引用类型,因此无法做到这一点。

          要么使用可为空的 DateTime (DateTime?),要么使用特定值来表示空,例如 DateTime.MinValue

          看看这里的例子:http://www.dotnetperls.com/nullable-datetime

          【讨论】:

            猜你喜欢
            • 2011-05-10
            • 1970-01-01
            • 2021-08-10
            • 2019-03-10
            • 2019-04-10
            • 2021-08-13
            • 2021-12-03
            • 2020-02-09
            • 1970-01-01
            相关资源
            最近更新 更多