2

我正在查看 LINQPad 中的一些代码高尔夫,想知道为什么:

int c;
string o;

o+=c;//this works

o+=P==2?"."+c:c;//this doesn't

o+=P==2?"."+c:""+c;//this does

主要是为什么第一个有效,而第二个会引发“'string'和'int'之间没有隐式转换”错误。

4

3 回答 3

4

字符串上的+运算符可以接受一个 int,从而产生另一个字符串。但是,没有从 int 到 string 的隐式(或显式)强制转换。

当您使用三元运算符?:时,两个“分支”必须是相同类型,或者一个的类型必须隐式转换为另一个。

在您的第二个示例中,第一个分支是一个字符串,在+运算符完成后,但第二个只是一个 int,所以它不起作用。在您的第三个示例中,两个分支都是字符串,所以没关系。

于 2010-08-31T15:54:20.430 回答
2

您的第二个非工作示例在?:运算符中具有不一致的类型。你所拥有的是:

o += (P == 2 ? (string) "." + c : (int) c);

(上面括号中的类型是为了阐明现有类型是什么,而不是将它们转换为不同的类型。)

三元运算符中的两边:必须是同一类型。因此,您的第二个示例是语法错误。第三个示例有效,因为与空字符串连接会强制c转换为字符串。

于 2010-08-31T15:53:05.817 回答
2

+=运算符使用运算+符,所以第一个真的是:

o = o + c;

编译器实际创建的是:

o = String.Concat((object)o, (object)c);

整数被装箱,并调用Concat接受object参数的方法。将在两个参数上调用该ToString方法以获取它们的字符串值,并将它们连接起来。

如果您首先将整数转换为字符串,则代码会更直接:

o += c.ToString();

变成:

o = String.Concat(o, c.ToString());

在第二个代码中,条件运算符中的类型不匹配:

bool ? string : int

第二个和第三个操作数必须具有相同的类型,就像在第三个代码中一样:

bool ? string : string

第二个代码真的变成了:

o = String.Concat(
  o,
  P == 2
    ? String.Concat((object)".", (object)c)
    : c
);

第三个代码真的变成了:

o = String.Concat(
  o,
  P == 2
    ? String.Concat((object)".", (object)c)
    : String.Concat((object)String.Empty, (object)c)
);

无论如何,您应该考虑使用 aStringBuilder来构建字符串而不是使用+=运算符:

StringBuilder builder = new StringBuilder;

if (P == 2) {
  builder.Append('.');
}
builder.Append(c);
于 2010-08-31T16:03:51.247 回答