将派生类型传递给 out 参数

Passing derived type into out parameter

我有一个具有以下签名的函数:

IEnumerable<TypeA> GetItems(string s, out IEnumerable<TypeB> otherItems)

(郑重声明,TypeATypeB 是不相关的类型,除了占位符之外,我的问题不涉及它们。

在我调用此函数的代码中,我想将 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> 类型的变量来调用该方法。您可以隐藏它(如上述情况),但它必须在某个时间某个地方存在。