For me it is works as it is. Where exactly is problem?
public static T FindThing<T>(this IList collection, int id) where T : IThing, new()
{
foreach (T thing in collection)
{
if (thing.Id == id)
return thing;
}
}
return null; //work
return (T)null; //work
return null as T; //work
return default(T); //work
}