Una versión diferente de FirstOrDefault

El método de extensión IEnumerable FirstOrDefault no hizo exactamente lo que quería, así que creé FirstOrValue. ¿Es esta una buena manera de hacer esto o hay una mejor manera?

public static T FirstOrValue<T>(this IEnumerable<T> source, Func<T, bool> predicate, T value)
{
    T first = source.FirstOrDefault(predicate);
    return Equals(first, default(T)) ? value : first;
}

Respuestas a la pregunta(4)

Su respuesta a la pregunta