159

有人可以解释为什么这在 C#.NET 2.0 中有效:

    Nullable<DateTime> foo;
    if (true)
        foo = null;
    else
        foo = new DateTime(0);

...但这不是:

    Nullable<DateTime> foo;
    foo = true ? null : new DateTime(0);

后一种形式给了我一个编译错误“条件表达式的类型无法确定,因为 '<null>' 和 'System.DateTime' 之间没有隐式转换。”

不是我不能使用前者,而是第二种风格更符合我的其余代码。

4

5 回答 5

335

编译器告诉您它不知道如何转换nullDateTime.

解决方案很简单:

DateTime? foo;
foo = true ? (DateTime?)null : new DateTime(0);

请注意,Nullable<DateTime>可以编写DateTime?这将为您节省大量打字。

于 2008-11-17T15:21:26.653 回答
20

仅供参考(Offtopic,但很漂亮并且与可空类型相关)我们有一个方便的运算符,仅用于可空类型,称为空合并运算符

??

像这样使用:

// Left hand is the nullable type, righthand is default if the type is null.
Nullable<DateTime> foo;
DateTime value = foo ?? new DateTime(0);
于 2008-11-17T15:25:48.767 回答
8

这是因为在三元运算符中,两个值必须解析为相同的类型。

于 2008-11-17T15:22:25.607 回答
3

另一个类似于接受的解决方案是使用 C# 的default关键字。虽然使用泛型定义,但它实际上适用于任何类型。

适用于 OP 问题的示例用法:

Nullable<DateTime> foo;
foo = true ? default(DateTime) : new DateTime(0);

当前接受的答案的示例用法:

DateTime? foo;
foo = true ? default(DateTime) : new DateTime(0);

此外,通过使用default,您无需指定变量nullable,以便为其分配null值。编译器将自动分配特定变量类型的默认值,不会遇到错误。例子:

DateTime foo;
foo = true ? default(DateTime) : new DateTime(0);
于 2012-08-27T15:04:17.613 回答
3

我知道这个问题是在 2008 年提出的,现在是 5 年后,但标记为答案的答案并不让我满意。真正的答案是 DateTime 是一个结构体,并且作为一个结构体它与 null 不兼容。你有两种解决方法:

首先是使 null 与 DateTime 兼容(例如,将 null 转换为 DateTime?正如拥有 70 票赞成的绅士所建议的那样,或者将 null 转换为 Object 或 ValueType)。

二是使 DateTime 与 null 兼容(例如,将 DateTime 转换为 DateTime?)。

于 2013-04-07T21:46:30.897 回答