我尝试使用以下示例代码? 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将这一个分成两个或三个语句。
答案 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));
编辑: 其他答案也可以使用,但是使用这种语法你甚至不需要转换。