首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将GLib.Array放在GLib.Value中?

将GLib.Array放在GLib.Value中?
EN

Stack Overflow用户
提问于 2018-03-18 03:38:26
回答 2查看 312关注 0票数 0

我不知道如何在GLib.Value中包装GLib.Array。

我试过这个代码。

代码语言:javascript
复制
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;
}

但它导致了这些错误。

代码语言:javascript
复制
(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
EN

回答 2

Stack Overflow用户

发布于 2018-03-18 08:12:06

我认为GValue被用作单一类型的值的容器,而GArray是一个集合。GValue确实有一个type_compatible ()方法。在您的代码显示GLib不允许将GArray存储为GObject之前,使用该方法进行检查:

代码语言:javascript
复制
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:

代码语言:javascript
复制
void main () {
    string[] a = {"test"};
    Variant variant = a;
    print (variant.print(true) + "\n");
}

如果您需要GValue,那么可以使用GValue的take_variant ()方法将GVariant存储在GValue中。

票数 0
EN

Stack Overflow用户

发布于 2018-03-19 17:55:49

GArray不是GObject。但是,它是一个boxed type (GValue中使用的更原始的类型标记版本),因此您应该能够使用value.set_boxed (a)将其存储在GValue中。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49341146

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档