C#方法的三元使用结果(带日期时间变量)
我有一个问题要解决 我已经声明了一个可为null的DateTime,我试图在其中放入一个日期,或者使用一个三元运算符放入一个null值 这不起作用:C#方法的三元使用结果(带日期时间变量),c#,datetime,ternary-operator,null-coalescing-operator,C#,Datetime,Ternary Operator,Null Coalescing Operator,我有一个问题要解决 我已经声明了一个可为null的DateTime,我试图在其中放入一个日期,或者使用一个三元运算符放入一个null值 这不起作用: DateTime? date; date = getDate() == DateTime.MinValue ? null : getDate() 我自己的代码有点复杂,但基本上我想使用的是 date = getDate() == DateTime.MinValue ? null : resultofgetDate()withoutactually
DateTime? date;
date = getDate() == DateTime.MinValue ? null : getDate()
我自己的代码有点复杂,但基本上我想使用的是
date = getDate() == DateTime.MinValue ? null : resultofgetDate()withoutactuallyrunningitagain
我不想做两次这个函数,但在这种情况下作为奖励,因为它是datetimes,所以它在else部分中也会给出一个错误
在我的第一个示例中,“null”和“System.DateTime”之间没有隐式转换
我不知道该往哪个方向看。我似乎需要与空合并运算符(??)相反的运算符。没有这样的运算符。你可以这样写:
DateTime? date = getDate();
date = date == DateTime.MinValue ? null : date;
DateTime? d = GetDate().Test(t => t == DateTime.MinValue, null);
没有这样的操作员。你可以这样写:
DateTime? date = getDate();
date = date == DateTime.MinValue ? null : date;
DateTime? d = GetDate().Test(t => t == DateTime.MinValue, null);
请这样做,但以下是我对扩展方法的看法:
public static T? Test<T>(this T? value, Predicate<T?> test, T? ifEquals) where T : struct
{
if (test(value))
{
return ifEquals;
}
return value;
}
请这样做,但以下是我对扩展方法的看法:
public static T? Test<T>(this T? value, Predicate<T?> test, T? ifEquals) where T : struct
{
if (test(value))
{
return ifEquals;
}
return value;
}
你有没有试过这样的方法:
DateTime? date;
var dt = getDate();
date = dt == DateTime.MinValue ? (DateTime?)null : dt;
希望能有所帮助。您是否尝试过以下方法:
DateTime? date;
var dt = getDate();
date = dt == DateTime.MinValue ? (DateTime?)null : dt;
希望有帮助。您也可以创建此扩展方法(其中一个重载调用另一个):
publicstatict?NullIfHasDefaultValue(此tV),其中T:struct
{
返回EqualityComparer.Default.Equals(v,Default(T))?(T?)null:v;
}
公共静态T?NullIfHasDefaultValue(此T?n),其中T:struct
{
返回n.GetValueOrDefault().NullIfHasDefaultValue();
}
当然,可以将其用作getDate()。NullIfHasDefaultValue()
您还可以创建此扩展方法(其中一个重载调用另一个):
publicstatict?NullIfHasDefaultValue(此tV),其中T:struct
{
返回EqualityComparer.Default.Equals(v,Default(T))?(T?)null:v;
}
公共静态T?NullIfHasDefaultValue(此T?n),其中T:struct
{
返回n.GetValueOrDefault().NullIfHasDefaultValue();
}
当然,将其用作getDate()。NullIfHasDefaultValue()
似乎getDate()
返回的是DateTime
,而不是DateTime?
(也称为Nullable
)。三元表达式中使用的值必须是相同的类型,这就是为什么会出现错误
您的第一个示例应该与
date = getDate() == DateTime.MinValue ? null : (DateTime?)getDate()`
正如马克比姆科在回答中指出的那样
我假设您返回DateTime.MinValue
作为某种错误处理/验证。如果您更改方法签名,使其返回一个DateTime?
您可以返回null
,那么您的语句将变为date=getDate()
,似乎getDate()
返回的是一个DateTime
,而不是DateTime?
(又称为null
)。三元表达式中使用的值必须是相同的类型,这就是为什么会出现错误
您的第一个示例应该与
date = getDate() == DateTime.MinValue ? null : (DateTime?)getDate()`
正如马克比姆科在回答中指出的那样
我假设您返回DateTime.MinValue
作为某种错误处理/验证。如果更改方法签名,使其返回DateTime?
可以改为返回null
,则语句变为date=getDate()
,然后将其分配给变量。比如var dt=getDate()代码>getdate()的返回类型是什么?然后将其分配给变量。比如var dt=getDate()代码>getdate()的返回类型是什么?这不正确DateTime.MinValue
不是Boolean
@afaolek您是对的-在仍然写出答案时意外提交了答案。这是不正确的DateTime.MinValue
不是Boolean
@afaolek您是对的-在仍然写出答案时意外提交了答案。=
可以在T?
和T?
之间使用吗?添加:考虑<代码>可空。等于(值,test)< /代码>,或删除约束和四代码> <代码>,使用<代码>均衡器比较器。默认值(值,测试)< /代码>。它不能;)@JeppeStigNielsen@JeppeStigNielsen现在使用谓词,它更干净了。==
可以在T?
和T?
之间使用吗?添加:考虑<代码>可空。等于(值,test)< /代码>,或删除约束和四代码> <代码>,使用<代码>均衡器比较器。默认值(值,测试)< /代码>。它不能;)@JeppeStigNielsen@JeppeStigNielsen现在使用谓词,它更干净了。这是一个适用于我的示例的方法,尽管我仍然需要用它运行两次方法。这不是问题,因为没有其他办法@MaKCbIMKo的解决方案就是我最后使用的解决方案,但是你的解决方案更接近问题,所以我将此标记为答案。你可以将getDate()的结果保存在一个临时变量中<代码>日期时间温度=getDate()代码>date=temp==DateTime.MinValue?null:(DateTime?)temp
这是一个适用于我的示例的方法,尽管我仍然需要使用它运行两次该方法。这不是问题,因为没有其他办法@MaKCbIMKo的解决方案就是我最后使用的解决方案,但是你的解决方案更接近问题,所以我将此标记为答案。你可以将getDate()的结果保存在一个临时变量中<代码>日期时间温度=getDate()代码>date=temp==DateTime.MinValue?空:(日期时间?)温度