一点背景:我在Mac OSX Lion上(显然是64位),我是一名长期有兴趣学习D的Java开发人员。
我选了 The D Programming Language 的副本,我对一些事感到困惑。首先,如果我尝试以下内容(直接来自本书):
int[] months = new int[12];
foreach (i, ref month; months) {
month = i + 1;
}
我收到以下错误:
错误:无法将ulong类型的表达式(i + 1LU)隐式转换为int
通过将i
更改为int i
来解决此问题。
我认为这是因为64位平台上的数字的自动类型是ulong
,所以类型推断并没有真正解决。
现在我遇到以下问题:
bool binarySearch(T)(T[] input, T value) {
// ...
int i = input.length / 2;
// ...
}
返回以下编译错误:
错误:无法将ulong类型的表达式(input.length / 2LU)隐式转换为int
Casting修复此问题,但我不愿意。我还得到了与从计算中获取long
值相关的其他愚蠢错误,然后无法将它们用于索引到数组中。 D的64位支持是不是还没达到鼻烟了吗?学习D时,我可以做些什么来避免将来遇到麻烦?在任何地方明确地使用演员表和类型似乎与首先吸引我的语言相反...
答案 0 :(得分:9)
我认为这是因为64位平台上的数字的自动类型是ulong,所以类型推断并没有真正解决。
正确。如果这是TDPL中的错误,您应该提交勘误表。 foreach
语句的索引变量通常始终为size_t
类型。
错误:无法将ulong类型的表达式(input.length / 2LU)隐式转换为int
将您的代码更改为:
size_t i = input.length / 2;
甚至更好,所以你不必考虑这个:
auto i = input.length / 2;
您所看到的实际上是完整的64位阵列支持。 size_t
解析为本机整数类型,并且用于数组索引和数组长度。
答案 1 :(得分:0)
关于未来
给某人
int[] months = new int[12];
foreach (int i, ref month; months) {
month = i + 1;
}