关于null:C#2.0 Empty Collection

C# 2.0 Empty Collection

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

在单元测试期间,我遇到了一个狡猾的小bug,其中一个异常被抛出到一条与错误无关的线上。最终我发现这是这个列表返回空值的结果。

为了防止出现这种情况,我认为返回这种类型集合的建议方法是使用Enumerable.Empty。但是,这需要LINQ(.NET 3.5+)。

有没有更好的方法(最佳实践?)在这种情况下返回一个非空的集合?

  • 是否有一个Enumerable.Empty()net 2(非linq)等价物?

以下是我尝试使用@eaglebag的建议:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
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...
    }
}

执行时,将生成以下异常:

An unhandled exception of type 'System.InvalidCastException' occurred in
MethodReturnEmptyCollection.exe

{"Unable to cast object of type
'System.Collections.Generic.List'1[MethodReturnEmptyCollection.ExampleItem][]' to type
'System.Collections.Generic.List'1[MethodReturnEmptyCollection.ExampleItem]'."}

更新:

在Eaglebag的输入之后,我发现这个问题回答了我的问题,并且非常有趣:相对于新列表,使用Enumerable.Empty()初始化IEnumerable更好吗?

发现了这一点:根据乔恩·斯基特的说法,你也可以用yield break来做同样的事情。


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

MyCustomList = new List()

附言:不管怎样,江户十一〔一〕也不会为你工作。List实现IEnumerable,而不是相反。