You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将GLib.Array封装到GLib.Value中?

解决GLib.Array封装到GLib.Value的问题

哦,这个问题我之前踩过坑!你遇到的错误根源很明确:GLib.Array并不是GObject的子类,但你却用了只适用于GObject实例的value.set_object()方法,这就导致了类型不匹配的断言错误。

先拆解下你看到的错误:

  • invalid uninstantiatable type '(null)' in cast to 'GObject':你强行把Array<string>转成Object,但它根本不是GObject类型,所以GLib无法识别这个类型,只能返回null。
  • g_value_set_object: assertion 'G_VALUE_HOLDS_OBJECT (value)' failed:你初始化的Value类型是Array,但set_object()要求Value必须持有GObject类型,两者不匹配,断言直接失败。

正确的解决方案:用Boxed类型处理

GLib专门为非GObject但需要在GValue中传递的类型提供了boxed类型机制,GLib.Array就属于这类。你需要用value.set_boxed()来替代set_object(),具体修正后的代码如下:

public int main (string[] args) { 
    // 最好指定Array的元素类型,更严谨
    var value = Value(typeof (Array<string>)); 
    var a = new Array<string>(); 
    a.append_val("test"); 
    // 使用set_boxed而非set_object
    value.set_boxed(a); 

    // 额外演示如何从Value中取出Array
    var retrieved_array = value.get_boxed() as Array<string>;
    if (retrieved_array != null) {
        print(@"取出的元素:$(retrieved_array.index(0))\n");
    }

    return 0; 
}

关键说明:

  1. 初始化Value时,指定具体的Array<string>类型比Array更安全,避免类型模糊。
  2. set_boxed()和get_boxed()是专门用来处理boxed类型的方法,GLib.Array、GLib.List这类非GObject容器都适用。
  3. 取出时记得用as做类型转换,确保类型安全。

内容的提问来源于stack exchange,提问作者Ava

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 10:25:52