对于这个 C#,a==true
:
bool a = "hello" + '/' + "world" == "hello/world";
对于这个 C# 代码,b==true
为真:
bool b = "hello" + + '/' + "world" == "hello47world";
我想知道这是如何发生的,更重要的是,为什么C#语言的架构师选择了这种行为?对于这个 C#,a==true
:
bool a = "hello" + '/' + "world" == "hello/world";
对于这个 C# 代码,b==true
为真:
bool b = "hello" + + '/' + "world" == "hello47world";
我想知道这是如何发生的,更重要的是,为什么C#语言的架构师选择了这种行为?+
将char
转换为int
,并将其添加到字符串中。字符/
的ASCII值为47,然后由另一个+运算符转换为字符串。+
运算符隐式地将其转换为int类型。请参见MSDN上的+操作符,查看“一元加”部分。
实际上,我通过查看数值类型的一元+操作符的结果只是这个操作数的值。
+
运算符实际调用了什么来弄清楚这一点。(我想这是ReSharper或VS 2015的功能)
++
,那你为什么要提到它们呢?这里的 +
是一元 +
运算符,在整数上的作用是恒等。 - CodesInChaosoperator +
有许多内置重载。这里相关的二进制重载是string operator +(string x, object y)
,它调用object
参数y
上的ToString()
,并连接两个字符串。对于一元重载,重要的是要注意没有一元重载接受char
。但是,char
可以隐式转换为ushort
和“更大”的整数类型。其中包括int
,而+'/'
的最佳重载是这个int operator +(int x)
。 - Jeppe Stig Nielsen这是因为你正在使用一元运算符+
。它类似于一元运算符-
,但它不改变操作数的符号,所以它在这里的唯一效果是将字符'/'
隐式转换为int
。
+'/'
的值是/
的字符代码,即47。
代码执行的内容与以下代码相同:
bool b = "hello" + (int)'/' + "world" == "hello47world";
+
在char
上定义的动机是什么。我可能会将其作为编译时错误。如果有人需要数值,为什么不明确地使用转换?(所以,基本上,为什么char
具有对int
的_隐式_转换?) - Vlad你也许会问,为什么要专门针对 char
类型使用运算符 int operator +(int x)
而不是其他很多优秀的一元 +
运算符呢?点击这里了解更多。
int slash = +'/'; // 47
public struct Char : IComparable, IConvertible
/// <internalonly/>
int IConvertible.ToInt32(IFormatProvider provider) {
return Convert.ToInt32(m_value);
}
IConvertible
”接口在代码注释中说明:
回顾一下结构体的目的(作为Unicode字符的值代表),很明显语言中这种行为的意图是为了提供一种将该值转换为支持的类型的方式。 “// IConvertible接口表示包含值的对象。此接口由System命名空间中的以下类型实现:
// Boolean、Char、SByte、Byte、Int16、UInt16、Int32、UInt32、Int64、UInt64、
// Single、Double、Decimal、DateTime、TimeSpan和String。
IConvertible
”继续说明:
这段文字明确说明不支持的转换会抛出异常。同时也明确说明将字符转换为整数将给出该字符的整数值。// System.XXX值类提供的IConvertible实现仅简单地转发到适当的Value.ToXXX(YYY)方法(下面描述了Value类)。
// 在不存在Value.ToXXX(YYY)方法的情况下(因为不支持特定的转换),IConvertible实现应该只抛出InvalidCastException异常。
void Main()
{
int slash = +'/';
Console.WriteLine(slash);
}
IL_0000: ldc.i4.s 2F
IL_0002: stloc.0 // slash2
IL_0003: ldloc.0 // slash2
IL_0004: call System.Console.WriteLine
IL_0009: ret
其中 '/'
只需转换为十六进制值2F(十进制为47),然后从那里使用。
+ '/'
这段文字是关于字符"/"的UTF-16 (decimal) 47字符编码,@Guffa已经解释了其中的原因。
+''
,会发生什么?它会导致语法错误吗? - user824425U+D83C U+DF81
),编译器将其计为“两个字符”(这与事实相差甚远)。 - user824425
+
是一种一元操作符,将char
转换为int
类型"。但没有人解释为什么会这样做。 - Rawlingint
的文章,但我怀疑没有人在意 :) - Rawling