在Vala

时间:2015-10-06 10:31:17

标签: pointers vala

我重构了一下我的代码,所以我需要一个可以包含多个侦听类型的指针:

owl_list = new Gee.LinkedList<OpenWithAction> ();
a_list = new Gee.LinkedList<OpenAppAction> ();

Gee.List* any_list = null;

所以我有一个指针any_list,我可以用来访问owl_list或a_list(取决于这里没有的开关,但假设有)

if (!any_list.size)
    return null;

但是当valac向我投掷时error: The name `size' does not exist in the context of `Gee.List*' if (!any_list.size)

会失败

我很长一段时间没有做任何C,C ++而且我不是vala专家,因为我使用了更多的无类型语言,但有什么方法可以使用吗?

修改

我刚试过

fieldType = OpenWithAction.get_type();
if (!(any_list as Gee.List<fieldType>).size)

error: The type name `fieldType' could not be found if (!(any_list as Gee.List<fieldType>).size) 显然我做错了什么,我想做的是:Vala: determine generic type inside List at runtime,我无法设法实现它。             return null;

编辑2:

我刚刚解决了我的问题:

正如@ jens-mühlenhoff所说,是 OpenWithAction OpenAppAction 有一个共同的祖先,它是 GLib.Action

所以我所要做的就是声明:

Gee.List<Action> any_list = null;

而不是

Gee.List* any_list = null;

现在foreach (var action in any_list)正在运行,但我仍然遇到错误

if (any_list->size == null)
    return null;

error: The name `size' does not exist in the context of `Gee.List<Synapse.Action>?' if (any_list->size == null)

另一个尝试是:

if (!any_list.size)
    return null;

Operator not supported for `int' if (!any_list.size)

2 个答案:

答案 0 :(得分:0)

any_list是一个指针,因此您无法使用.运算符。试试any_list->size

答案 1 :(得分:0)

我做错了两件事:

<强> 1 - 就像在C#中一样,如果不需要,我不应该使用指针。所以使用: Gee.List<Action> any_list = null;工作正常。解释是 OpenWithAction OpenAppAction 有一个共同的祖先类,因此声明具有该类型的List工作正常(另一方面我不知道在他们没有共同祖先的情况下。

2 - int 类型不能用作 bool 类型,因此if (any_list.size == 0)可以使用{{1}会抛出错误

感谢每一位人士的帮助:)。