0

我正在开发一个用 .NET 2.0 编写的库,该库具有一个返回类型列表对象的静态方法。

在单元测试期间,我遇到了一个鬼鬼祟祟的小错误,在与错误无关的行上抛出了一个异常。最终我发现这是这个列表返回 null 的结果。

为了防止这种情况,我看到返回这种类型集合的推荐方法是使用Enumerable.Empty<TResult>. 但是,这需要 Linq (.NET 3.5 +)。

在这种情况下,有没有更好的方法(最佳实践?)返回 null 以外的集合?

  • 是否有Enumerable.Empty<T>().NET 2(非 Linq)等价物?

这是我尝试使用@EagleBeak 的建议:

namespace MethodReturnEmptyCollection
{
    public partial class Form1 : Form
    {
        private static List<ExampleItem> MyCustomList = null;

        public Form1()
        {
            InitializeComponent();
            MyCustomList = CreateEmptyListOfExampleItems();
        }

        private static List<ExampleItem> CreateEmptyListOfExampleItems()
        {
            // Throws an invalid cast exception...
            return (List<ExampleItem>)GetEmptyEnumerable<List<ExampleItem>>(); 
        }

        public static IEnumerable<T> GetEmptyEnumerable<T>()
        {
            return new T[0];
        }
    }

    public class ExampleItem
    {
        // item properties... 
    }
}

执行时会产生以下异常:

MethodReturnEmptyCollection.exe 中出现“System.InvalidCastException”类型的未处理异常

{“无法将
'System.Collections.Generic.List'1[MethodReturnEmptyCollection.ExampleItem][]' 类型的对象转换为 'System.Collections.Generic.List'1[MethodReturnEmptyCollection.ExampleItem]'。”}


更新:

在 EagleBeak 的输入之后,我发现这个问题回答了我的问题并且非常有趣:
使用 Enumerable.Empty() 而不是 new List 来初始化 IEnumerable 是否更好?

也发现了这个:
根据 Jon Skeet的说法,你也可以yield break用来做同样的事情。

4

1 回答 1

1

只需丢弃两个私有方法并在构造函数中初始化您的列表,如下所示:

MyCustomList = new List<ExampleItem>();

PS:Enumerable.Empty<T>无论如何都不适合你。List<T>工具IEnumerable<T>,而不是相反。

于 2015-01-07T12:46:46.823 回答