4

有人可以向我解释以下编译器问题吗

错误:无法确定条件表达式的类型,因为 'string' 和 'int' 之间没有隐式转换

// WORKS
string text = string.Format(
    "the id is {0}", _Obj.Id.ToString());

// WORKS, without implicit conversion <<<
string text = string.Format(
    "the id is {0}", _Obj.Id);

// WORKS
string text = string.Format(
    "the id is {0}", (_Obj == null) ? "unknown" : _Obj.Id.ToString());

// NO WAY <<<
string text = string.Format(
    "the id is {0}", (_Obj == null) ? "unknown" : _Obj.Id);

在最后一个示例中,也没有隐式转换。

4

8 回答 8

9

问题与您对string.Format. 问题是这个表达式:

(_Obj == null) ? "unknown" : _Obj.Id

int编译器无法确定此表达式的类型,因为和之间没有隐式转换string。您已经找到了解决方案 - 调用ToString意味着表达式string在任何一种情况下都返回 a。您可以修复它的另一种方法(但在这种情况下由于装箱而效率稍低)是明确告诉编译器如何执行转换。例如,您可以使用显式强制转换object

(_Obj == null) ? "unknown" : (object)_Obj.Id

您的第二个示例无需显式转换即可工作,因为string.Format需要 anobject并且存在从intto的隐式转换object

于 2010-11-15T11:43:09.087 回答
5

Eric Lippert 的 Cast 运算符不遵守分配律

于 2010-11-15T11:50:52.370 回答
2

这个表达式计算的类型是什么?

(_Obj == null) ? "unknown" : _Obj.Id
于 2010-11-15T11:42:11.477 回答
1

我认为您需要从 MSDN 阅读此内容: 条件运算符

特别是这部分:

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

如果 X 和 Y 是相同的类型,那么这是条件表达式的类型。否则,如果存在从 X 到 Y 的隐式转换(第 6.1 节),但不存在从 Y 到 X 的转换,则 Y 是条件表达式的类型。否则,如果存在从 Y 到 X 的隐式转换(第 6.1 节),而不是从 X 到 Y,则 X 是条件表达式的类型。否则,无法确定表达式类型,并出现编译时错误。

于 2010-11-15T11:47:22.640 回答
0
"the id is {0}", (_Obj == null) ? "unknown" : _Obj.Id

编译器必须选择选择string类型或integer(猜测)默认情况下不能交换,反之亦然(没有隐式转换)

string text = string.Format("the id is {0}", _Obj.Id)

string.Formatobjectarg 为参数,因此将 Id(整数)转换为对象没有问题。

于 2010-11-15T11:44:51.647 回答
0

最后一个工作,因为string.format会接受(string, object)

第一个不起作用,因为 ? :运算符需要匹配类型。

于 2010-11-15T11:45:21.153 回答
0

问题是

// WORKS, without implicit conversion 
string text = string.Format( 
    "the id is {0}", _Obj.Id); 

// NO WAY 
string text = string.Format( 
    "the id is {0}", (_Obj == null) ? "unknown" : _Obj.Id); 

不一样!

试着想想这个词

(_Obj == null) ? "unknown" : _Obj.Id);

作为

function int Eval(object obj)
{
  if (obj == null)
  {
    return "unknown";
  }
  else
  {
    return "1";
  }
}

这显然是行不通的。所以整个事情与string.format.

于 2010-11-15T11:48:56.510 回答
-1

在第一种情况下(不起作用)如果_Obj == null,您返回 a string,否则您返回 a int。这当然会导致问题,因为在这种情况下您尝试分配一个intto string text

于 2010-11-15T11:41:16.387 回答