【问题标题】:extension that creates StackOverflow exception创建 StackOverflow 异常的扩展
【发布时间】:2011-02-15 08:12:35
【问题描述】:

我为一个类写了一个函数扩展。此扩展函数返回 IList 作为结果。 大多数时候,我想将 IList 转换为数组 T[]。 这需要我声明“使用 System.Linq;”在每个将 IList 转换为 T[] 的类中。 因此,为了为我保存“使用 System.Linq;”的声明;我在原始扩展的同一类中编写了一个扩展(因此我不必声明“使用”):

    public static T[] ToArray<T>(this IList<T> list)
    {
        return list.ToArray();
    }

当然,扩展类有“使用 System.Linq;”,但这是我需要放置此声明的唯一地方。 问题是我得到了 StackOverflow 异常,因为命令“list.ToArray();”实际上是递归调用自身而不是原始 ToArray。 我可以更改函数的名称 - MakeArray 而不是 ToArray,但我想保留我的命名约定。 或许你有什么解决办法?

【问题讨论】:

  • 认真的吗?您正在经历所有这些额外的工作来避免将using System.Linq; 添加到几个源文件的顶部?这只是坚果。如果你以正确的方式做事,你的问题就会消失,而不是一些荒谬的黑客行为。在你写这个问题的时间里,你可以将using声明复制并粘贴到你的所有源文件中。
  • 但现在你肯定需要在“My.Static.Extensions”中添加引用和使用子句——这不是零和游戏吗?
  • @nonnb:我想关键是他的所有其他源代码都在同一个命名空间中。但是,是的,这是一个非常愚蠢的立场,IMO。

标签: c# asp.net visual-studio visual-studio-2010


【解决方案1】:

首先,我强烈建议您不要这样做。您已经“保存”了一行(单个 using 指令)并添加了四行不起作用。为什么单个 using 指令对您来说如此痛苦?它不影响其余代码,而且几乎完全无害……当然,它还为您提供了 LINQ 的所有其他优点。

如果你真的必须这样做,你可以直接调用 LINQ 版本:

public static T[] ToArray<T>(this IList<T> list)
{
    return System.Linq.Enumerable.ToArray(list);
}

但是只是不要

【讨论】:

  • 我有超过 100 个文件,而不是“少数”源文件。
  • @Naor:如果您在同一个命名空间中有一百个类,您至少应该考虑这是否真的是一个好主意。但即便如此,每个文件中只有一行 - 为什么您认为这是一个问题?
  • @Naor:即使您的 IDE 没有提供任何轻松添加 using 的方法,您也是程序员,该死。启动您选择的脚本语言并将该行放入您需要的所有文件中,无论是 100 还是 100000。
  • @Naor:即使您确实有 100 个源文件,您是否真的需要将其中的 每个 中的一些 IList 更改为 T[],当然,您并没有在所有文件中明确要求使用数组而不是 IEnumerable 或 IList 等,我原以为您可以将其限制在真正需要数组的少数特殊情况?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-02-15
  • 2011-09-18
  • 1970-01-01
  • 2014-08-18
  • 2020-09-25
  • 2022-07-22
  • 1970-01-01
相关资源
最近更新 更多