我有一个带有以下签名的函数:
IEnumerable<TypeA> GetItems(string s, out IEnumerable<TypeB> otherItems)
(对于记录,TypeA
和TypeB
是不相关的类型,除了占位符之外,我的问题并不涉及它们。
在我调用此函数的代码中,我想将返回值和out
参数值放入我的类的List
字段中,因为我想确保它们被枚举并且我不久之后执行特定于列表的操作。
考虑:
private List<TypeA> _fieldA;
private List<TypeB> _fieldB;
// ... other code
// conversion errors for _fieldA and _fieldB:
_fieldA = Fns.GetItems(str, out _fieldB);
// _fieldA is now ok, but not _fieldB:
_fieldA = Fns.GetItems(str, out _fieldB).ToList();
// Same result as previous, out param must be a variable.
_fieldA = Fns.GetItems(str, out _fieldB.AsEnumerable()).ToList();
// This works but makes me sad:
IEnumerable<TypeB> tempEnumerable;
_fieldA = Fns.GetItems(str, out tempEnumerable).ToList();
_fieldB = tempEnumerable.ToList();
基本上,第四次尝试是获得我需要的最佳方式,还是有更好的&#34;获取该功能列表的方法(缺少修改功能,这是不可能的)?
答案 0 :(得分:2)
由于您无法修改函数的签名,因此为它创建一个包装函数:(无论是该方法的另一个重载,还是另一个类中的方法,如果需要的话。)
//TODO come up with a better name
List<TypeA> GetItemsAsLists(string s, out List<TypeB> otherItems)
{
IEnumerable<TypeB> tempEnumerable;
var output = Fns.GetItems(s, out tempEnumerable).ToList();
otherItems = tempEnumerable.ToList();
return output.ToList();
}
在某些时候,某个地方,您必须拥有IEnumerable<TypeB>
类型的变量才能调用该方法。你可以隐藏它(就像上面的情况一样),但它必须存在于某个地方,某处。