关于表达的问题:a? b:c

时间:2009-09-17 04:09:39

标签: c#

我尝试使用以下示例代码? b:c表达式:

DateTime? GetValue(string input)
{
  DateTime? val = string.IsNullOrEmpty(input) ? null : DateTime.Parse(input);
  return val;
}

我收到了编译错误,因为在a? b:c表达式因为b和c是不同的数据类型;不确定我是否可以使用(DateTime?)案例来解决问题?

  DateTime? val = string.IsNullOrEmpty(input) ? null : (DateTime?) DateTime.Parse(input);

我宁愿不使用if将这一个分成两个或三个语句。

5 个答案:

答案 0 :(得分:11)

return string.IsNullOrEmpty(input) ? (DateTime?)null : DateTime.Parse(input);
//or
return string.IsNullOrEmpty(input) ? null : (DateTime?)DateTime.Parse(input);

要么工作,你必须在两种类型之间提供一些兼容性的方法,因为DateTime不能为null,你需要显式地使用一个你试图转到DateTime?,然后编译器可以隐式投下另一个。

答案 1 :(得分:3)

编译器确保你的a和b中的b和c? b:c属于同一类型。在您的原始示例中,c是DateTime(因为DateTime.Parse返回DateTime),而b不能是DateTime导致其为null,因此编译器说:

  

条件表达式的类型不能   确定是因为没有   ''之间的隐式转换   和'System.DateTime'

你可以让它工作(因为有从DateTime到DateTime的隐式转换)

 DateTime? val = string.IsNullOrEmpty(input) ? (DateTime?)null : DateTime.Parse(input);

但是......我认为这是下列更容易遵循的案例之一。

DateTime? val = null;
if (!string.IsNullOrEmpty(input)) {
  val =  DateTime.Parse(input);
}

有一点需要注意,这个功能的整个前提是非常危险的,你有时只会提前失败。

该方法具有非常奇怪的语义!如果在中传递无效的日期格式,除非为空或空字符串,否则它将失败并出现异常。这违反了早期失败的原则。

答案 2 :(得分:2)

你真的尝试过吗?是的有效。抓住LINQPad尝试这样的小事。

  

LINQPad不仅仅是一个LINQ工具:它是一个高度符合人体工程学的代码片段IDE,可立即执行任何C#/ VB表达式,语句块或程序 - 最终的动态开发。结束那些混乱源文件夹的数百个Visual Studio Console项目!

答案 3 :(得分:1)

我刚试过

public static DateTime? GetValue(string input)
{
    DateTime? val = string.IsNullOrEmpty(input) ? null : (DateTime?)DateTime.Parse(input); 
    return val;
}

它工作正常。

答案 4 :(得分:0)

使用此:

DateTime? val = string.IsNullOrEmpty(input) ? null : new DateTime?(DateTime.Parse(input));

编辑: 其他答案也可以使用,但是使用这种语法你甚至不需要转换。