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

Types D自动类型错误(64位问题?),types,casting,d,type-inference,Types,Casting,D,Type Inference,一点背景:我在MacOSXLion上(显然是64位),我是一名长期的Java开发人员,对学习D感兴趣 我拿起了一份D编程语言的副本,我对一些事情感到困惑。首先,如果我尝试以下方法(直接从书中): 我得到以下错误: 错误:无法将ulong类型的表达式(i+1LU)隐式转换为int 通过将i更改为int i可以解决此问题 我认为这是因为64位平台上数字的自动类型是ulong,因此类型推断实际上不起作用 现在我有以下问题: bool binarySearch(T)(T[] input, T value

一点背景:我在MacOSXLion上(显然是64位),我是一名长期的Java开发人员,对学习D感兴趣

我拿起了一份D编程语言的副本,我对一些事情感到困惑。首先,如果我尝试以下方法(直接从书中):

我得到以下错误:

错误:无法将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

铸造修复这一点,但我宁愿不。我还遇到了其他愚蠢的错误,这些错误与从计算中获取
long
值有关,然后无法将它们用于索引到数组中。D的64位支持还没有达到标准吗?学习D时,我能做些什么来避免将来的麻烦?在任何地方都必须显式地使用类型转换和类型,这似乎与最初吸引我使用该语言的原因相反

我认为这是因为64位平台上数字的自动类型是ulong,因此类型推断实际上不起作用

对。如果这是TDPL中的错误,您可能应该提交勘误表。
foreach
语句的索引变量通常总是
size\u t
类型

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

将代码更改为:

size_t i = input.length / 2;
或者更好,所以你不必考虑这个:

auto i = input.length / 2;
事实上,您看到的是,完整的64位阵列支持
size\u t
解析为本机整数类型,用于数组索引和数组长度。

对某人

int[] months = new int[12];
foreach (int i, ref month; months) {
    month = i + 1;
}
注意:这只是“愚蠢的”,因为您没有使用C语言,而在Java中,与体系结构无关的代码实际上并不存在。因此,在Java中必须使用32位整数或64位整数来索引数组,而在C(和D)中,在索引数组时应该使用
size\t
。这使您的代码更加正确(并且与平台无关),当然,D会为您处理这种类型。(在C和D中,
size\u t
几乎总是自动别名为无符号32位整数或无符号64位,这就是为什么您看到的是其中一个名称而不是
size\u t
int[] months = new int[12];
foreach (int i, ref month; months) {
    month = i + 1;
}