【问题标题】:Conditional operator in C# and return types [duplicate]C# 中的条件运算符和返回类型
【发布时间】:2011-07-20 03:58:08
【问题描述】:

可能的重复:
Why does null need an explicit type cast here?
Nullable types and the ternary operator. Why won't this work?

尝试执行以下操作:

sqlCmd.Parameters.Add("@DateCreated", System.Data.SqlDbType.DateTime).Value 
    = myObject.DateCreated == DateTime.MinValue 
    ? DBNull.Value : myObject.DateCreated;

我收到此错误:

条件表达式的类型不能 确定,因为没有 之间的隐式转换 'System.DBNull' 和 'System.DateTime'

我显然理解了这个错误,但是考虑到 Parameters.Value 是对象类型,为什么类型甚至很重要?有没有办法完成我想做的事情?

【问题讨论】:

标签: c# sql types type-conversion ternary-operator


【解决方案1】:

返回值进入object 并没有什么区别,因为必须首先确定返回值的类型

将两个值之一(DBNull.ValuemyObject.DateCreated)转换为另一个值的基数,你会没事的。在这种情况下,基数甚至可以是object

【讨论】:

  • 干杯,没想到在运算符本身中进行演员表。回想起来很傻。
  • 但这是为什么呢?每个表达式确定自己的类型,但在运行时只计算一个。作为一名程序员,我只关心结果是否可以分配给我的变量。如果它可以在我使用 var 时推断出类型,那就太好了,但是甚至不考虑所有时间基类型,这样做会做得很糟糕,无论如何我都必须添加那个丑陋的演员表。
  • @ThomasEyde:不确定我是否理解,但在运行时评估什么并不重要;编译器必须在编译时找出表达式值的单一类型。
  • @Jon:如果我写object o = b ? new A() : new B(),编译器除了:两个表达式都可以分配给o 之外,什么都没有。 A和B之间没有关系的事实是无关紧要的。编译器完成这项工作所需的一切都已经存在。
  • @ThomasEyde:我明白了。好吧,从顶部打开一罐蠕虫。说 A 类:I1、I2 和 B 类:I1、I2。 b ? new A() : new B() 的类型是什么?如果将三元数输入var 会怎样?如果这两个类都有到 C 的隐式转换运算符怎么办?当然,编译器确实可以尝试适应您并在某些时候成功,但是 a) 可能无法证明仅在某些时候有效且已经有简单的解决方法可用的功能是合理的,并且 b) 引入了“让我猜猜你真正想要什么”,这违背了语言的精神。
猜你喜欢
  • 2012-01-22
  • 1970-01-01
  • 2021-02-20
  • 1970-01-01
  • 1970-01-01
  • 2015-03-23
  • 2013-09-01
相关资源
最近更新 更多