D自动类型错误(64位问题?)

6 types casting type-inference d

一点背景:我在Mac OSX Lion(显然是64位),我是一名长期有兴趣学习D的Java开发人员.

我拿起了D编程语言的副本,我对一些事情很困惑.首先,如果我尝试以下内容(直接来自本书):

int[] months = new int[12];
foreach (i, ref month; months) {
    month = i + 1;
}
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:

错误:无法将ulong类型的表达式(i + 1LU)隐式转换为int

这是通过改为i来解决的int i.

我认为这是因为64位平台上的数字的自动类型是ulong,所以类型推断并没有真正解决.

现在我有以下问题:

bool binarySearch(T)(T[] input, T value) {
    // ...
    int i = input.length / 2;
    // ...
}
Run Code Online (Sandbox Code Playgroud)

返回以下编译错误:

错误:无法将ulong类型的表达式(input.length/2LU)隐式转换为int

Casting修复了这个,但我宁愿不这样做.我还得到了与long从计算中获取值相关的其他愚蠢错误,然后无法将它们用于索引到数组中.D的64位支持是不是还没达到鼻烟了吗?学习D时,我可以做些什么来避免将来遇到麻烦?必须明确地使用演员阵容和类型到处看起来与首先吸引我的语言相反...

小智 9

我认为这是因为64位平台上数字的自动类型是ulong,所以类型推断并没有真正解决.

正确.如果这是TDPL中的错误,您应该提交勘误表.foreach语句的索引变量通常总是类型size_t.

错误:无法将ulong类型的表达式(input.length/2LU)隐式转换为int

将您的代码更改为:

size_t i = input.length / 2;
Run Code Online (Sandbox Code Playgroud)

或者甚至更好,所以你不必考虑这个:

auto i = input.length / 2;
Run Code Online (Sandbox Code Playgroud)

实际上,您所看到的是完整的64位阵列支持.size_t解析为本机整数类型,并且用于数组索引和数组长度.