将派生类型传递给out参数

时间:2015-04-08 19:39:33

标签: c# ienumerable out

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

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

(对于记录,TypeATypeB是不相关的类型,除了占位符之外,我的问题并不涉及它们。

在我调用此函数的代码中,我想将返回值和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;获取该功能列表的方法(缺少修改功能,这是不可能的)?

1 个答案:

答案 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>类型的变量才能调用该方法。你可以隐藏它(就像上面的情况一样),但它必须存在于某个地方,某处。