4

我们可以:

var t=new String(new[] { '繁', '體', '中', '文' });

或者

var encoding=Encoding.Unicode;
var bytes=encoding.GetBytes(new[] { 'E', 'n', 'g', 'l', 'i', 's', 'h' });
var t=encoding.GetString(bytes);

没有类似的东西:

public static implicit operator String(char[] charArray) {
    return new String(charArray);
}

我们不可以:

String t=new[] { 'р', 'у', 'с', 'с', 'к', 'и', 'й', '\x20', 'я', 'з', 'ы', 'к' };

我知道字符数组与字符串不同;但有时我只想直接将一个字符数组分配给一个字符串;没有显式转换、转换或new X(new Y(new Z ....

而且我个人认为,未提供它的原因可能是:
C-Sharp 团队希望程序员,尤其是有 C++/C 经验的程序员记住,C-SharpC++ 或 C不同。

问题是为什么不呢?那不好吗?

4

6 回答 6

4

隐式转换是编译器功能。CLI 规范中没有任何内容允许它们,IL 中的所有转换都是显式的。即使是简单的,比如 int to long 和 float to double。因此,在您的情况下,由 C# 团队决定是否使该语法起作用。

C# 团队对此的思考方式已广为人知。每个可能的功能都从 -100 分开始,并且需要一些认真的动力才能达到 +100,以证明设计该功能、实现它、记录它和维护它所涉及的工作是合理的。我不能代表他们说话,但我严重怀疑这个是否超过 0。替代方案是显而易见且简单的,因此不值得。

于 2013-01-11T17:53:37.627 回答
1

我不知道那里有任何特定文档说明它们为什么不包含此功能。

我的猜测是,他们可以在每个 .NET 版本中实现的功能数量有限,最终他们认为认为此功能有益的人数并不能证明花时间实现它是合理的(特别是考虑到有一个构造函数可以完全满足您的需求)。

我发现了这个问题,虽然它没有直接回答您的问题,但它确实涉及 .NET 中 char 数组和字符串之间的一些重要区别。在 .NET 中,字符串与字符数组不同(在 C++ 中可能如此)。也许他们正试图将这个概念锤击回家。

于 2013-01-11T17:25:57.407 回答
0

你总是可以有类似的东西:

char[] chars = { 'a','b','c','d' };
string s = new string(chars);
于 2013-01-11T17:29:35.397 回答
0

字符数组与字符串不同,所以不能直接赋值。这对我来说似乎是一个很好的理由。

我会做这样的事情:

char[] arr = { 'a', 'b', 'c' };
string s = new String(arr);
于 2013-01-11T17:30:33.327 回答
0

在基类库中,您将很难找到任何不主要涉及值类型的隐式(或显式)表示更改转换的示例(现在我只能想到byte, short, int, long,之间的数字转换floatdouble和有符号/无符号变体)。

至于为什么没有实施这种转换......

  • 字符数组和字符串的行为非常不同;
  • 可读性/可理解性的损失高于开发者便利性的收益;
    • 增加开发者的便利性:少输入 12 个字符;
    • 可读性下降:
      • 读者必须知道:
      • 转换存在;
      • 目标变量是 astring还是 a char[]
      • 转换创建并分配一个新string对象;
于 2013-01-11T17:59:04.547 回答
0

编译器应该如何理解您使用的确切类型?

void DoIt(string data)
{
}

void DoIt(char[] data)
{
}

应该调用哪些方法?

DoIt(new[] { 'р', 'у', 'с', 'с', 'к', 'и', 'й', ' ', 'я', 'з', 'ы', 'к' })

将此功能仅用于分配看起来像是设计不良的语法糖。

于 2013-01-11T18:00:36.927 回答