C#方法的三元使用结果(带日期时间变量)

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

我有一个问题要解决

我已经声明了一个可为null的DateTime,我试图在其中放入一个日期,或者使用一个三元运算符放入一个null值

这不起作用:

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?空:(日期时间?)温度