更新:我今天使用这个问题作为我博客的主题。谢谢你的好问题。请参阅博客了解未来的添加、更新、cmets 等。
http://blogs.msdn.com/ericlippert/archive/2009/10/01/why-does-char-convert-implicitly-to-ushort-but-not-vice-versa.aspx
我并不完全清楚你到底在问什么。 “为什么”的问题很难回答。但我会试一试。
首先,具有从 char 到 int 的隐式转换的代码(注意:这不是“隐式转换”,这是“隐式转换”)是合法的,因为 C# 规范明确指出存在从 char 到 int 的隐式转换char 到 int,编译器在这方面是规范的正确实现。
现在,您可能会明智地指出,该问题已被彻底提出。为什么存在从 char 到 int 的隐式转换?为什么语言的设计者认为这是添加到语言中的明智规则?
嗯,首先,阻止这成为语言规则的显而易见的事情并不适用。 char 实现为无符号 16 位整数,表示 UTF-16 编码中的字符,因此可以将其转换为 ushort 而不损失精度,或者就此而言,不改变表示。运行时只是从将此位模式视为 char 到将相同的位模式视为 ushort。
因此可能允许从 char 转换为 ushort。现在,仅仅因为某事是可能的并不意味着它是一个好主意。显然,该语言的设计者认为将 char 隐式转换为 ushort 是一个好主意,但将 ushort 隐式转换为 char 则不是。 (并且由于 char 到 ushort 是一个好主意,char-to-anything-that-ushort-goes-to 似乎也是合理的,因此,char 到 int。另外,我希望清楚为什么允许 explicit ushort 到 char 的转换是明智的;你的问题是关于隐式转换。)
所以我们在这里实际上有两个相关的问题:首先,为什么允许从 ushort/short/byte/sbyte 到 char 的隐式转换是一个坏主意?第二,
为什么允许从 char 到 ushort 的隐式转换是个好主意?
与您不同,我可以使用语言设计团队的原始笔记。通过这些挖掘,我们发现了一些有趣的事实。
第一个问题包含在 1999 年 4 月 14 日的注释中,其中出现了从字节转换为字符是否合法的问题。 在 C# 的原始预发布版本中,这在很短的时间内是合法的。我对注释进行了轻微的编辑以使其清晰,而无需了解 1999 年时代的预发布 Microsoft 代号。我还强调了重点:
[语言设计委员会]选择提供
从字节到的隐式转换
字符,因为一个的域是
完全被对方包容。
然而,现在,[运行时
library] 仅提供 Write 方法
采用字符和整数,这意味着
该字节打印为字符
因为那最终是最好的
方法。我们可以通过以下方式解决这个问题
在 Writer 上提供更多方法
类或通过删除隐式
转换。
有一个论据来解释为什么
后者是正确的做法。
毕竟,字节真的不是
字符。确实,可能有一个
有用的映射 从字节到字符,但最终,23 并不表示
与 ascii 的字符相同
值 23,与 23B 相同
表示与 23L 相同的东西。问
[图书馆作者]提供这个
附加方法仅仅是因为
我们的类型系统中的一个怪癖是如何工作的
out 似乎比较弱。所以我会
建议我们进行转换
从字节到字符显式。
笔记最后得出结论,byte-to-char 应该是显式转换,integer-literal-in-range-of-char 也应该是显式转换。
请注意,语言设计说明没有说明为什么 ushort-to-char 同时也被定为非法,但您可以看到同样的逻辑适用。当调用重载为 M(int) 和 M(char) 的方法时,当您将 ushort 传递给它时,您很可能希望将 ushort 视为一个数字,而不是一个字符。而且 ushort 不是字符表示,就像 ushort 是数字表示一样,因此将这种转换设为非法似乎也是合理的。
1999 年 9 月 17 日决定让 char 转到 ushort;那天关于这个主题的设计说明只是简单地说“char 到 ushort 也是一种合法的隐式转换”,就是这样。注释中没有进一步说明语言设计者那天脑子里发生的事情。
但是,对于为什么隐式 char-to-ushort 被认为是一个好主意,我们可以做出 有根据的猜测。这里的关键思想是从数字到字符的转换是一种“可能不可靠”的转换。它把你不知道的东西当作一个角色,并选择把它当作一个角色来对待。这似乎是您想要明确指出您正在做的事情,而不是意外允许它。但反过来就没有那么狡猾了。在 C 编程中,将字符视为整数有着悠久的传统——获取它们的基本值,或者对它们进行数学运算。
简而言之:使用数字作为字符可能是意外和错误似乎是合理的,但使用字符作为数字是故意和可取的似乎也是合理的。因此,这种不对称性反映在语言规则中。
这能回答你的问题吗?