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()
我有一个问题想解决
我已经声明了一个可以为 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()