我正在尝试使用条件运算符,但我对它认为结果应该是什么类型感到困惑。
下面是我设计的一个示例来展示我遇到的问题:
class Program
{
public static void OutputDateTime(DateTime? datetime)
{
Console.WriteLine(datetime);
}
public static bool IsDateTimeHappy(DateTime datetime)
{
if (DateTime.Compare(datetime, DateTime.Parse("1/1")) == 0)
return true;
return false;
}
static void Main(string[] args)
{
DateTime myDateTime = DateTime.Now;
OutputDateTime(IsDateTimeHappy(myDateTime) ? null : myDateTime);
Console.ReadLine(); ^
} |
} |
// This line has the compile issue ---------------+
在上面指出的行中,我收到以下编译错误:
无法确定条件表达式的类型,因为“”和“System.DateTime”之间没有隐式转换
我很困惑,因为该参数是可为空类型(DateTime?)。为什么它需要转换?如果它为空,则使用它,如果它是日期时间,则使用它。
我的印象是:
condition ? first_expression : second_expression;
与以下内容相同:
if (condition)
first_expression;
else
second_expression;
显然情况并非如此。这背后的原因是什么?
(注意:我知道如果我将“myDateTime”设置为可为空的日期时间,那么它就会起作用。但为什么需要它呢?
正如我之前所说,这是一个人为的例子。在我的真实示例中,“myDateTime”是一个数据映射值,不能为空。)
编译器不会根据结果的使用来推断条件运算符结果的类型,而是根据其参数的类型来推断。当编译器看到此表达式时,它会失败,因为它无法推断出结果的类型:
IsDateTimeHappy(myDateTime) ? null : myDateTime;
Since null
and DateTime
不兼容,你需要告诉编译器类型应该是什么。演员阵容应该可以解决问题:
DateTime? x = IsDateTimeHappy(myDateTime) ? (DateTime?)null : myDateTime;
OutputDateTime(x);
现在编译器就不会有问题了。如果您愿意,您也可以将以上内容写在一行上(但我可能不会这样做):
OutputDateTime(IsDateTimeHappy(myDateTime) ? (DateTime?)null : myDateTime);
埃里克·利珀特有一个好答案 https://stackoverflow.com/questions/1669492/are-there-any-good-reasons-why-ternaries-in-c-are-limited/1672282#1672282这也与这里相关,并详细介绍了编译器如何确定类型。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)