我重构了一下我的代码,所以我需要一个可以包含多个侦听类型的指针:
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)
答案 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}会抛出错误
感谢每一位人士的帮助:)。