【发布时间】:2019-02-15 17:47:12
【问题描述】:
首先:我知道如何解决这个问题。我不是在寻找解决方案。我对导致一些隐式转换而没有导致其他转换的设计选择背后的原因很感兴趣。
今天我在我们的代码库中遇到了一个小但有影响力的错误,其中int 常量被初始化为相同数字的char 表示。这导致ASCII 将char 转换为int。像这样的:
char a = 'a';
int z = a;
Console.WriteLine(z);
// Result: 97
我很困惑为什么 C# 会允许这样的事情。在四处搜索后,我发现了以下 SO 问题以及 Eric Lippert 本人的回答:Implicit Type cast in C#
摘录:
但是,我们可以对为什么隐式进行有根据的猜测 char-to-ushort 被认为是一个好主意。这里的关键思想是 从数字到字符的转换是“可能是狡猾的” 转换。它正在采取一些你不知道的意图 成为一个角色,并选择将其视为一个角色。这似乎是 你想明确指出你正在做的事情, 而不是意外地允许它。但相反的要少得多 狡猾。 C 编程中有一个悠久的传统 作为整数的字符——获取它们的基础值,或者做 数学。
我同意它背后的原因,尽管 IDE 提示会很棒。但是,我还有另一种情况,隐式转换突然不合法:
char a = 'a';
string z = a; // CS0029 Cannot implicitly convert type 'char' to 'string'
以我的拙见,这种转换非常合乎逻辑。它不会导致数据丢失,并且作者的意图也很明确。此外,在我阅读了关于 char 到 int 隐式转换的其余答案后,我仍然看不出这不合法的任何理由。
这就引出了我的实际问题:
C# 设计团队有什么理由不实现从 char 到 string 的隐式转换,虽然它看起来如此明显(尤其是与 char 到 @ 相比时) 987654334@转换)。
【问题讨论】:
-
顺便说一下,char->string 在 VB.NET 中完全有效(即使 Option Strict On 也是如此)。使用 Option Strict Off 时,即使 string->char 也是有效的(字符串的第一个字符被占用,真是一团糟)。
标签: c# .net implicit-conversion language-design