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

C# ternary use results of method (with datetime variable)

我有一个问题想解决

我已经声明了一个可以为 null 的 DateTime,我正在尝试使用三元运算符将日期或空值放入其中。

这不起作用:

DateTime? date;
date = getDate() == DateTime.MinValue ? null : getDate()

我自己的代码有点复杂,但基本上我想使用的是

date = getDate() == DateTime.MinValue ? null : resultofgetDate()withoutactuallyrunningitagain

我不想两次执行该功能,但在这种情况下作为奖励,因为它是日期时间,它还在 else 部分给出了一个错误说 There is no implicit conversion between 'null' and 'System.DateTime' 在我的第一个例子中。

我不确定要看哪个方向。我似乎需要与空合并运算符 (??) 相反的东西。

没有这样的运算符。你可以这样写:

DateTime? date = getDate();
date = date == DateTime.MinValue ? null : date;

请这样做 ,但这是我对扩展方法的看法:

public static T? Test<T>(this T? value, Predicate<T?> test, T? ifEquals) where T : struct
{
    if (test(value))
    {
        return ifEquals;
    }

    return value;
}

这样使用:

DateTime? d = GetDate().Test(t => t == DateTime.MinValue, null);

你有没有尝试过类似的东西:

DateTime? date;
var dt = getDate();
date = dt  == DateTime.MinValue ? (DateTime?)null : dt;

希望对您有所帮助。

您还可以创建此扩展方法(其中一个重载调用另一个重载):

public static T? NullIfHasDefaultValue<T>(this T v) where T : struct
{
  return EqualityComparer<T>.Default.Equals(v, default(T)) ? (T?)null : v;
}
public static T? NullIfHasDefaultValue<T>(this T? n) where T : struct
{
  return n.GetValueOrDefault().NullIfHasDefaultValue();
}

当然是用getDate().NullIfHasDefaultValue().

似乎 getDate() 是 returning DateTime 而不是 DateTime?(又名 Nullable<DateTime>)。三元表达式中使用的值必须属于同一类型,这就是您收到错误的原因。

您的第一个示例应该适用于

date = getDate() == DateTime.MinValue ? null : (DateTime?)getDate()`

正如 MaKCbIMKo 的回答中所指出的那样。

我假设你 return DateTime.MinValue 作为某种错误处理/验证。如果您更改方法签名使其 return 成为 DateTime? 您可以 return null 代替,那么您的语句将变为 date = getDate()