这是为什么扩展方法不工作?

我不能做我想要的。 我只是想占非国际的代表。 但是,当我打电话ActiveAccounts(),我没有变空,我发现了一个枚举,然后包含空值。 我在做什么错在这里? 请帮助。

public static class AccountExt { public static IEnumerable<Account> ActiveAccounts( this AccountRep rep ) { if( rep == null ) throw new ArgumentNullException(); if( rep.IsInternational ) yield return null; foreach( var acc in rep.FetchAccounts() ) { if( acc.IsActive ) yield return acc; } } }

--------------解决方案-------------

嗯,有两件事情会在这里的。

首先,你不只是有一个扩展方法 ,你有一个扩展方法迭代器块 -这是当你使用你所得到的yield return来自动实现IEnumerable<>合同。

这听起来像你想有发生什么事是ActiveAccounts()返回一个空IEnumerable<Account> 什么是实际发生的是,国际代表你返回null 作为了IEnumerable的第一个元素 。 我怀疑你可能已经尝试使用return null有,但有一个编译器错误是这样的:

错误:无法从迭代器返回一个值。 使用yield return语句返回一个值,或屈服破来结束迭代。

如果您打算什么是可枚举是空的 ,你想要的是yield break ,而不是yield return null 它实际上是一个更好的主意,通常,返回一个空序列,因为它允许调用者,以避免检查返回值。 它还玩家更好的与技术,如LINQ,它使用成分来组装复杂的查询。

第二个问题是, if( rep == null )当你调用前提条件是不计算ActiveAccounts()而是当你开始枚举调用的结果。 这可能不是你想要的东西 - 我想你想的前提下,立即进行评估。

您解决这两个问题的方法是使用一个两阶段实现:

public static class AccountExt
{
// apply preconditions, return null for international reps
public static IEnumerable<Account> ActiveAccounts( this AccountRep rep )
{
if( rep == null )
throw new ArgumentNullException( "rep" );
if( rep.IsInternational )
return null;
// otherwise...
return ActiveAccountsImpl( rep );
}

// private implementation handles returning active accounts
private static IEnumerable<Account> ActiveAccountsImpl( AccountRep rep )
{
foreach( acc in rep.FetchAccounts() )
{
if( acc.IsActive )
yield return acc;
}
}
}

如果你愿意使用LINQ,以可避免Impl版的功能:

public static IEnumerable<Account> ActiveAccounts( this AccountRep rep )
{
if( rep == null )
throw new ArgumentNullException( "rep" );
if( rep.IsInternational )
return null;
// otherwise, using LINQ to filter the accounts...
return rep.FetchAccounts().Where( acc => acc.IsActive );
}

您可以了解更多关于迭代器块是如何在这里。

此时应更换yield return nullyield break 。 这将会给回一个空序列。

如果你真的想返回null的,而不是IEnumerable话LBushkin的答案是你想要的; 然而,它更通常的做法是返回一个空序列,因为它不要求消费者必须检查返回值。

分类:C# 时间:2012-06-29 人气:0
分享到:

相关文章

Copyright (C) 55228885.com, All Rights Reserved.

55228885 版权所有 京ICP备15002868号

processed in 0.197 (s). 9 q(s)