我无法弄清楚如何在GLib.Value中包装GLib.Array。
我尝试了这段代码。
public int main (string[] args) {
var value = Value(typeof (Array));
var a = new Array<string>();
a.append_val("test");
value.set_object((Object) a);
return 0;
}
但它导致了这些错误。
(process:1797): GLib-GObject-WARNING **: invalid uninstantiatable type '(null)' in cast to 'GObject'
(process:1797): GLib-GObject-CRITICAL **: g_value_set_object: assertion 'G_VALUE_HOLDS_OBJECT (value)' failed
答案 0 :(得分:0)
我认为GValue被用作单一类型值的容器,而GArray是一个集合。 GValue确实有type_compatible ()
方法。在代码显示GLib之前使用该方法作为检查不允许将GArray存储为GObject:
public int main (string[] args) {
if (!Value.type_compatible (typeof (Array), typeof (Object))) {
message ("Incompatible types");
return 1;
}
var value = Value(typeof (Array));
var a = new Array<string>();
a.append_val("test");
value.set_object((Object) a);
return 0;
}
此代码停止检查兼容类型的位置。
我不知道你想要实现什么,但我建议看看GVariant:
void main () {
string[] a = {"test"};
Variant variant = a;
print (variant.print(true) + "\n");
}
如果您需要GValue,则可以使用GValue的take_variant ()
方法将GVariant存储在GValue中。
答案 1 :(得分:0)
GArray
不是GObject
。但是,它是boxed type(GValue
中使用的类型标记的更原始版本),因此您应该能够使用GValue
将其存储在value.set_boxed (a)
中。< / p>