获取列表

时间:2018-05-05 03:23:50

标签: c++-cli

当T是值类型时,是否可以获取对System :: Collections :: Generic :: List元素的引用?

以下生成警告C4172,因为索引器返回的值是临时副本。

value struct
PluginInfo
{
    //...
};

List<PluginInfo^ pluginInfos = gcnew List<PluginInfo>();

PluginInfo%
GetPluginInfo(Handle handle)
{
    for (i32 i = 0; i < pluginInfos->Count; i++)
    {
        PluginInfo% pluginInfo = pluginInfos[i];
        if (pluginInfo.handle == handle)
        {
            return pluginInfo;
        }
    }
}

1 个答案:

答案 0 :(得分:1)

不,这是不可能的。

.NET泛型集合类是在主.NET语言(C#,VB.NET)不支持byref返回时设计的。因此,元素访问仅通过(索引的)getter / setter对完成,其中进行复制。

这也避免了有序集合中直接元素访问的缺点(例如SortedListDictionary),每次元素值发生变化时都需要知道,以便项目可以移动到正确的位置集合中的新位置。为了保持一致的界面,即使全新的集合也不太可能使用byref返回。

您是否考虑在收藏中使用参考类型?即使您要存储的类型是值类型,您也可以创建一个包含它的引用类作为成员,这将允许您使用引用语义传递它(当然,以内存位置为代价)。