Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/276.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 单行if语句生成强制转换错误_C#_If Statement - Fatal编程技术网

C# 单行if语句生成强制转换错误

C# 单行if语句生成强制转换错误,c#,if-statement,C#,If Statement,我是C#的新手,所以我对一个简短的陈述有意见。我想改变 if (m_dtLastLogin == null) drow["LastLogin"] = DBNull.Value; else drow["LastLogin"] = m_dtLastLogin; 到 长版本工作得很好,但是,短版本会生成错误“无法确定条件类型,因为'System.DBNull'和'System.DateTime?'之间没有隐式转换”。我的支持代码基本上是 private DateTime? m_dtL

我是C#的新手,所以我对一个简短的陈述有意见。我想改变

if (m_dtLastLogin == null)
    drow["LastLogin"] = DBNull.Value;
else
    drow["LastLogin"] = m_dtLastLogin;

长版本工作得很好,但是,短版本会生成错误“无法确定条件类型,因为'System.DBNull'和'System.DateTime?'之间没有隐式转换”。我的支持代码基本上是

private DateTime? m_dtLastLogin;
m_dtLastLogin = null;
DataRow drow;
drow = m_oDS.Tables["Users"].Rows[0];
有人能帮我做一下速记吗?

将两者都转换为“对象”:

条件运算符要求两个部分(“then”和“else”部分)计算为同一类型,这将是表达式的结果类型

您的原始版本在没有强制转换的情况下工作,因为它最终在类型为
object

的字段中转换为“object”:

条件运算符要求两个部分(“then”和“else”部分)计算为同一类型,这将是表达式的结果类型


您的原始版本在没有强制转换的情况下工作,因为它最终出现在类型为
object
的字段中。好吧,错误消息非常清楚。编译器需要确定整个x?y:z表达式的类型。如果y和z有相同的类型,这很容易。如果y可转换为z,则表达式的类型为z,同样,如果z可转换为y,则表达式的类型为y

在您的例子中,y的类型是DBNull,y的类型是m_dtLastLogin的类型(可能是datetime)。这两种类型不能相互转换,并且没有公共的基类型(Object除外),因此编译器不知道该做什么

但是,您可以通过将y或z强制转换为对象来帮助编译器:

drow["LastLogin"] = (m_dtLastLogin == null) ? (object)System.DBNull.Value : 
    (object)m_dtLastLogin;
drow["LastLogin"] = (m_dtLastLogin == null) ? (object)System.DBNull.Value : m_dtLastLogin;

这样,整个表达式就具有type对象,然后可以将其分配给
drow[“LastLogin”]

参考: C语言规范-

第14.13节,条件运算符

引述

?运算符的第二个和第三个操作数控制条件表达式的类型。设X和Y是第二个和第三个操作数的类型。那么

  • 如果X和Y是同一类型,则这是条件表达式的类型

  • 否则,如果存在从X到Y的隐式转换(§13.1),但不存在从Y到X的隐式转换,则Y是条件表达式的类型

  • 否则,如果存在从Y到X的隐式转换(§13.1),但不存在从X到Y的隐式转换,则X是条件表达式的类型

  • 否则,无法确定表达式类型,并发生编译时错误


嗯,错误信息非常清楚。编译器需要确定整个x?y:z表达式的类型。如果y和z有相同的类型,这很容易。如果y可转换为z,则表达式的类型为z,同样,如果z可转换为y,则表达式的类型为y

在您的例子中,y的类型是DBNull,y的类型是m_dtLastLogin的类型(可能是datetime)。这两种类型不能相互转换,并且没有公共的基类型(Object除外),因此编译器不知道该做什么

但是,您可以通过将y或z强制转换为对象来帮助编译器:

drow["LastLogin"] = (m_dtLastLogin == null) ? (object)System.DBNull.Value : 
    (object)m_dtLastLogin;
drow["LastLogin"] = (m_dtLastLogin == null) ? (object)System.DBNull.Value : m_dtLastLogin;

这样,整个表达式就具有type对象,然后可以将其分配给
drow[“LastLogin”]

参考: C语言规范-

第14.13节,条件运算符

引述

?运算符的第二个和第三个操作数控制条件表达式的类型。设X和Y是第二个和第三个操作数的类型。那么

  • 如果X和Y是同一类型,则这是条件表达式的类型

  • 否则,如果存在从X到Y的隐式转换(§13.1),但不存在从Y到X的隐式转换,则Y是条件表达式的类型

  • 否则,如果存在从Y到X的隐式转换(§13.1),但不存在从X到Y的隐式转换,则X是条件表达式的类型

  • 否则,无法确定表达式类型,并发生编译时错误


?:
不是一个“单行if”,它只是一个条件运算符。?:必须在两个条件下返回相同的类型…顺便说一句:我想问一下
m\u dtLAstLogin。HasValue
?:
不是一个“单行if”,它只是一个条件运算符。?:必须在两个条件中返回相同的类型…顺便说一句:我会问
m\dtLAstLogin.HasValue
这两个部分不需要具有相同的类型。它们只需要转换为一种通用类型,两个部件不需要具有相同的类型。它们只需要转换成一种普通类型就行了。我对(DateTime?)System.DBNull.values的对象太过具体了,我已经添加了对语言规范的引用,这很有意义。我对一个(DateTime?)System.DBNull.values的对象太过具体了。我已经添加了对语言规范的引用。