C# 以单行条件传递空值

C# 以单行条件传递空值,c#,.net,asp.net,visual-studio-2008,C#,.net,Asp.net,Visual Studio 2008,只是一个虚构的代码,但为什么这行不通呢?(由于date变量可为空) 错误是“在系统之间没有显式转换。DateTime和null可以是任何引用类型,您必须将其强制转换或使用作为运算符: DateTime? date = textBoxDate.Text != "" ? textBoxDate.Text : null as DateTime?; 假设textBoxDate可以隐式转换为Datetime?,这无疑是完整的…(我假设在现实中,您有一个更有意义的条件-Text可能是一个字符串属性,将其指

只是一个虚构的代码,但为什么这行不通呢?(由于
date
变量可为空)


错误是“在
系统之间没有显式转换。DateTime

null
可以是任何引用类型,您必须将其强制转换或使用
作为
运算符:

DateTime? date = textBoxDate.Text != "" ? textBoxDate.Text : null as DateTime?;
假设textBoxDate可以隐式转换为Datetime?,这无疑是完整的…

(我假设在现实中,您有一个更有意义的条件-
Text
可能是一个字符串属性,将其指定给
Datetime?
变量没有多大意义。)

编译器不知道条件表达式的类型。它没有考虑到有一个赋值给
DateTime?
变量的事实-它只是试图找到正确的类型

现在表达式的类型必须是LHS的类型或RHS的类型…但是:

  • null
    没有类型,因此它不能是RHS的类型
  • 没有从
    DateTime
    null
    的转换,因此它也不能是LHS的类型
解决此问题的最简单方法是为RHS提供一个实类型,以便:

default(DateTime?)
(DateTime?) null
new DateTime?()
当然,您可以将LHS改为
DateTime?

试试这个:

DateTime? date = String.IsNullOrEmpty(textBoxDate.Text) ? 
null as DateTime? : DateTime.Parse(textBoxDate.Text);

嗯,我不知道您的textBoxDate.Text类是什么样的,但我能够让它工作、编译并返回预期结果

    TextBox textBoxDate = new TextBox();
    textBoxDate.Text = string.Empty;
    DateTime? date = (textBoxDate.Text != "") ? (DateTime?)DateTime.Parse(textBoxDate.Text) : null;

我认为显式转换到
(DateTime?
是您所需要的

您只需退出初始转换即可 datetime?==类型不允许为空值, datetime==不带允许的空值

DateTime date = textBoxDate.Text != "" ? textBoxDate.Text : null;
左侧的重复在右侧被检查后被检查!因此编译器不知道它应该是
DateTime?
,并且由于它们不是相同的类型,它正在尝试相互转换。如果您明确地将其中一个值转换为
DateTime?
,它将工作。
DateTime date = textBoxDate.Text != "" ? textBoxDate.Text : null;