Generics Vala:传递泛型数组会损坏值

Generics Vala:传递泛型数组会损坏值,generics,vala,Generics,Vala,如何将数组传递给泛型函数?以下代码确实可以编译,但输出有点损坏: void foo<T> (T[] arr) { foreach (T element in arr) { var element2 = (int) element; stdout.printf (element2.to_string() + "\n"); } } void main () { int[] array = { 0, 1, 2, 3, 4, 5,

如何将数组传递给泛型函数?以下代码确实可以编译,但输出有点损坏:

void foo<T> (T[] arr) {
    foreach (T element in arr) {
        var element2 = (int) element;
        stdout.printf (element2.to_string() + "\n");
    }
}


void main () {
    int[] array = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
    foo<int> (array);
}
void foo(T[]arr){
foreach(arr中的T元素){
var element2=(int)元素;
stdout.printf(element2.to_string()+“\n”);
}
}
空干管(){
int[]数组={0,1,2,3,4,5,6,7,8,9};
foo(数组);
}
输出:
0
2
4
6
8
113
0
-1521013800
0
0


我做错了什么?

您发现了一个编译器错误

该数组被视为指针数组,然后当
foreach
尝试迭代该指针数组时,就会出现问题

顺便说一句:如果编译为32位,它是有效的,因为
sizeof(gint)==sizeof(gpointer)

编译器不应允许将值类型的数组传递给泛型函数

这可以通过使用
Gee.Collection
而不是数组来解决:

void foo<T> (Gee.Collection<T> coll) {
    foreach (T element in coll) {
        var element2 = (int) element;
        stdout.printf (element2.to_string() + "\n");
    }
}


void main () {
    int[] array = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
    foo<int> (new Gee.ArrayList<int>.wrap (array));
}
可空类型也不是完美的,因为它们需要更多的内存,而且它们的性能不如值类型,但事实就是如此


代码仍然有点问题,因为您正在将元素强制转换为
int
(或者在我的版本中是
int?
),但我想您知道这不是一个好主意,因为这只是一些测试代码,对吧?

确切地说,这只是一些测试代码,表明它不起作用:)
void foo<T> (T[] coll) {
    foreach (T element in coll) {
        var element2 = (int?) element;
        stdout.printf (element2.to_string() + "\n");
    }
}

void main () {
    int?[] array = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
    foo (array);
}