首先:我知道如何解决这个问题.我不是在寻找解决方案.我对设计选择背后的原因感兴趣,导致一些隐含的转换并且没有导致其他转换.
今天我在代码库中遇到了一个小但有影响的错误,其中一个int
常量用char
相同数字的表示初始化.这导致ASCII
转换char
为a int
.像这样的东西:
char a = 'a';
int z = a;
Console.WriteLine(z);
// Result: 97
Run Code Online (Sandbox Code Playgroud)
我很困惑为什么C#会允许这样的东西.搜索后我发现以下SO问题,Eric Lippert自己给出了答案:C#中的隐式类型转换
摘录:
但是,我们可以做出有根据的猜测,为什么隐含的char-to-ushort被认为是个好主意.这里的关键思想是从数字到字符的转换是"可能是狡猾的"转换.它正在采取你不知道的东西是一个角色,并选择将其视为一个角色.这似乎是你想要明确表达的事情,而不是意外地允许它.但反之则不那么狡猾.C编程中有一个悠久的传统,即将字符视为整数 - 获取它们的基础值,或者对它们进行数学处理.
我同意它背后的推理,虽然IDE提示会很棒.但是,我有另一种情况,隐式转换突然不合法:
char a = 'a';
string z = a; // CS0029 Cannot implicitly convert type 'char' to 'string'
Run Code Online (Sandbox Code Playgroud)
这种转换是我的拙见,非常符合逻辑.它不会导致数据丢失,作者的意图也很清楚.还后,我读了答案的其余部分char
,以int
隐式转换,我还没有看到任何理由,这不应该是合法的.
这就引出了我的实际问题:
C#设计团队有什么理由可以实现隐式转换char
为a string
,而它看起来很明显(特别是在将它char
与int
转换进行比较时).