当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;
}
}
}
答案 0 :(得分:1)
不,这是不可能的。
.NET泛型集合类是在主.NET语言(C#,VB.NET)不支持byref返回时设计的。因此,元素访问仅通过(索引的)getter / setter对完成,其中进行复制。
这也避免了有序集合中直接元素访问的缺点(例如SortedList
或Dictionary
),每次元素值发生变化时都需要知道,以便项目可以移动到正确的位置集合中的新位置。为了保持一致的界面,即使全新的集合也不太可能使用byref返回。
您是否考虑在收藏中使用参考类型?即使您要存储的类型是值类型,您也可以创建一个包含它的引用类作为成员,这将允许您使用引用语义传递它(当然,以内存位置为代价)。