将派生类型传递给 out 参数
Passing derived type into out parameter
我有一个具有以下签名的函数:
IEnumerable<TypeA> GetItems(string s, out IEnumerable<TypeB> otherItems)
(郑重声明,TypeA
和 TypeB
是不相关的类型,除了占位符之外,我的问题不涉及它们。
在我调用此函数的代码中,我想将 return 值和 out
参数值放入 class 的 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();
基本上,第四次尝试是获得我需要的东西的最佳方法,还是有 "better" 方法从该函数中获取列表(除了修改函数,这是不可能的)?
由于您无法修改函数的签名,因此为它创建一个包装函数:(无论是该方法的另一个重载,还是另一个 class 中的方法,如果需要的话。)
//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>
类型的变量来调用该方法。您可以隐藏它(如上述情况),但它必须在某个时间某个地方存在。
我有一个具有以下签名的函数:
IEnumerable<TypeA> GetItems(string s, out IEnumerable<TypeB> otherItems)
(郑重声明,TypeA
和 TypeB
是不相关的类型,除了占位符之外,我的问题不涉及它们。
在我调用此函数的代码中,我想将 return 值和 out
参数值放入 class 的 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();
基本上,第四次尝试是获得我需要的东西的最佳方法,还是有 "better" 方法从该函数中获取列表(除了修改函数,这是不可能的)?
由于您无法修改函数的签名,因此为它创建一个包装函数:(无论是该方法的另一个重载,还是另一个 class 中的方法,如果需要的话。)
//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>
类型的变量来调用该方法。您可以隐藏它(如上述情况),但它必须在某个时间某个地方存在。