Scott Solmer
Scott Solmer

Reputation: 3897

C# 2.0 Empty Collection

I'm working on a library written in .NET 2.0 that has a static method which returns an object of type list.

During unit testing I ran into a sneaky little bug whereby an exception was being thrown on a line that had nothing to do with the error. Eventually I discovered it was the result of this list returning null.

To prevent this type of situation, I see that the recommended way to return this type of collection is to use Enumerable.Empty<TResult>. However, that requires Linq (.NET 3.5 +).

Is there a better way (best practice?) to return a collection other than null in this situation?


Here is my attempt to use @EagleBeak's suggestion:

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... 
    }
}

When executed, the following exception is generated:

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]'."}


Update:

After EagleBeak's input, I found this question which answers mine and is quite interesting:
Is it better to use Enumerable.Empty() as opposed to new List to initialize an IEnumerable?

Found this too:
According to Jon Skeet, you can also use yield break to do the same thing.

Upvotes: 0

Views: 972

Answers (1)

EagleBeak
EagleBeak

Reputation: 7419

Just throw away the two private methods and initialize your list in the constructor like this:

MyCustomList = new List<ExampleItem>();

PS: Enumerable.Empty<T> wouldn't work for you anyway. List<T> implements IEnumerable<T>, not the other way round.

Upvotes: 1

Related Questions