这听起来真的很愚蠢。但我对D编程语言有一个奇怪的问题。当我尝试创建这样的新数组时:
import std.stdio;
void main()
{
char[] variable = "value";
writefln(variable);
}
DMD编译器总是给我这个错误:
test.d(5):错误:无法隐式 转换类型的表达式(“值”) 不变(char [5u])到char []
知道为什么吗?我正在为Ubuntu使用2.014 alpha(可用here)。
答案 0 :(得分:10)
我正在搜索指南的数组部分,这可能会有所帮助:
char[] str1 = "abc"; // error, "abc" is not mutable
char[] str2 = "abc".dup; // ok, make mutable copy
invariant(char)[] str3 = "abc"; // ok
invariant(char)[] str4 = str1; // error, str4 is not mutable
invariant(char)[] str5 = str1.idup; // ok, make invariant copy
来自here。
答案 1 :(得分:9)
基本上,它归结为字符串文字存储在内存的只读部分。 char[]
是“可变字符的可变数组”,如果写入,会生成运行时崩溃。
所以编译器真的试图在这里保护你。
invariant(char)[]
表示“一个可变数组的不变字符”,这正是它的原因。
PS :当您 需要为char[]
时,您可能希望使用auto
,如,{ {1}}。让你不要考虑它的类型:)
答案 2 :(得分:4)
使用auto,不要担心类型是什么:
auto s = "some text";
让编译器担心类型。
答案 3 :(得分:4)
D语言有两个主要版本。它们通常彼此互不兼容,尽管代码可以编写以便在两者中编译。
D1是您提供的代码似乎是用来编写的。它没有不可变数组的概念,因此可行。
D2是你试图编译它,因此2开始编译器版本号。 D2特有的主要特性之一是const和immutable / invariant数据引用的概念。
char[] text; // mutable data
const(char)[] ctext; // data may be mutable or immutable - but either way,
// it will not be changed through this reference
invariant(char)[] itext; // immutable data
D2中的字符串文字被归类为不可变数据,因此不能分配给char [],而只能分配给const(char)[]
或invariant(char)[]
(或wchar或dchar等价物)。
string
是invariant(char)[]
的别名,您可能希望将其用于方便或D1兼容性。