How can I return NULL from a generic method in C#?

c#, generics

Solution

Three options:

- Return `default` (or `default(T)` for older versions of C#) which means you'll return `null` if `T` is a reference type (or a nullable value type), `0` for `int`, `'\0'` for `char`, etc. (Default values table (C# Reference))

- If you're happy to restrict `T` to be a reference type with the `where T : class` constraint and then return `null` as normal

- If you're happy to restrict `T` to be a non-nullable value type with the `where T : struct` constraint, then again you can return `null` as normal from a method with a return value of `T?` - note that this is not returning a null reference, but the null value of the nullable value type.

Problem

I have a generic method with this (dummy) code (yes I'm aware IList has predicates, but my code is not using IList but some other collection, anyway this is irrelevant for the question...) ``` static T FindThing<T>(IList collection, int id) where T : IThing, new() { foreach (T thing in collection) { if (thing.Id == id) return thing; } return null; // ERROR: Cannot convert null to type parameter 'T' because it could be a value type. Consider using 'default(T)' instead. } ``` This gives me a build error "Cannot convert null to type parameter 'T' because it could be a value type. Consider using 'default(T)' instead." Can I avoid this error?

Original source