【问题标题】:Nullable DateTime in C#C# 中的可空日期时间
【发布时间】:2016-07-17 22:40:24
【问题描述】:

我有两个与日期时间分配有关的问题

DateTime? y = 1 == 1 ? null: DateTime.MaxValue;
DateTime? y = null; // assignment works as expected
  • 为什么第一次赋值会出现nullDateTime?之间的类型转换错误
  • 在 c# 中,DateTime? 的空赋值是首选方式。

    DateTime? x = default(DateTime?); //prints null on console
    
    DateTime? x = null;               // prints null on console
    
    DateTime? x = DateTime.MinValue;  //print 01/01/0001 
    

【问题讨论】:

  • 您需要将DateTime.MaxValue 转换为(DateTime?) 或转换为null。 DateTimenull 之间没有转换,因为 DateTime 不可为空。
  • default(),对于任何值类型(DateTime 是一个值类型),总是会调用无参数构造函数。在这种情况下,无参数构造函数没有要分配的值,因此您在控制台中看到 null

标签: c# .net datetime variable-assignment nullable


【解决方案1】:

第二条语句DateTime? y = null; 只是将null 赋值给一个可以为空的对象。

而第一个是条件赋值,它为真状态分配一些值,为假状态分配一些其他值;在这里,您使用条件运算符来评估条件。根据MSDN first_expression (如果为真则执行)second_expression*(如果为假则执行)* 必须是相同类型或隐式转换必须从一种类型到另一种类型存在。在我们的例子中,两者都是不同的,所以简单的解决方案是像这样进行显式转换:

DateTime? y = 1 == 1 ?(DateTime?) null : DateTime.MaxValue;

【讨论】:

  • 我认为最好的选择是输入DateTime.MaxValue 而不是null。这样一来,OP 和其他人就会更有意义和更容易理解。
【解决方案2】:

A1。因为在ternary operator 中,两个表达式/结果都应该属于同一类型。

累加。转至 MSDN Either the type of first_expression and second_expression must be the same, or an implicit conversion must exist from one type to the other.

在您的问题中,nullDateTime.MinValue 不匹配,因此出现错误 conversion between null and DateTime

你可以的

DateTime? y = 1 == 1 ? null : (DateTime?)DateTime.MaxValue;

这样两个答案都会返回一个类型为DateTime?的答案。

A2. 通常没有指定/首选的分配方式。这取决于用户约定。这三个都很好,取决于用户的要求。

【讨论】:

  • 因为他们为什么比修复更重要。
【解决方案3】:

因为?: Operator 运算符希望双方的类型相同。

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

所以解决方案如下:

DateTime? y = 1 == 1 ? (DateTime?)null : DateTime.MaxValue;

对于第二个问题,这将是空赋值的好方法

DateTime? x = null;

【讨论】:

    【解决方案4】:

    日期时间? y = 1 == 1?空:DateTime.MaxValue;

    此语句给出赋值错误不是因为对变量进行空赋值,而是因为在三元运算符中使用空赋值,并且当您在这里使用类类型时,三元运算符不会导致您这样做是非法的根据提到的 CLR 规范的东西,它可能会给你一个直接的编译错误。

    //Which is the preferred way for null assignments of DateTime? in c#.
    
    DateTime? x = default(DateTime?); //prints null on console
    
    DateTime? x = null; // prints null on console
    
    DateTime? x = DateTime.MinValue; //print 01/01/0001
    

    根据提供的规范和指南,在任何情况下都不应将类类型分配为 null,因此根据标准,您可以使用最小值(尽管您也可以使用默认值,但它可能会在需要时影响类型转换)

    【讨论】:

      【解决方案5】:

      你提到的第二个。您需要在 Nikhil Agrawal 爵士提出的这段时间内强制转换为空值。

      三元

        int y = 1;
        DateTime? dt3 = y == 1 ? (DateTime?)null : DateTime.MinValue;
      

      传统方式

             DateTime? dt3 = null;
      
              if (y == 1)            
                   dt3 = null;            
              else
                  dt3 = DateTime.MinValue;
      

      【讨论】:

        【解决方案6】:

        如果你想将 null 转换为可以为空的日期时间,那么你可以使用

        DateTime? dt = (DateTime?)null;
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2021-06-26
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-03-26
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多