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

时间:2012-03-16 05:22:09

标签: types casting d type-inference

一点背景:我在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时,我可以做些什么来避免将来遇到麻烦?在任何地方明确地使用演员表和类型似乎与首先吸引我的语言相反...

2 个答案:

答案 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;
}