I have the following extension methods, which compile successfully and behave as designed.

```
public static IEnumerable<T> WhereNotEmpty<T>(this IEnumerable<T> source) where T : struct {
    return source.Where(item => !item.Equals(default(T)));
}

public static IEnumerable<V> SelectNotEmpty<T, V>(this IEnumerable<T> source, Func<T, V> selector) where V : struct {
    return source.Select(selector).WhereNotEmpty();
}

```

However, in an effort to avoid the boxing, I added a new generic constraint as follows:

```
public static IEnumerable<T> WhereNotEmpty<T>(this IEnumerable<T> source) where T : struct, IEquatable<T> {
    return source.Where(item => !item.Equals(default(T)));
}

public static IEnumerable<V> SelectNotEmpty<T, V>(this IEnumerable<T> source, Func<T, V> selector) where V : struct, IEquatable<T> {
    return source.Select(selector).WhereNotEmpty(); // compile error!
}

```

I'm now getting a compile error where `SelectNotEmpty` calls `WhereNotEmpty`:

> 
> The type 'V' cannot be used as type parameter 'T' in the generic type
>  or method
>  'MyExtensions.WhereNotEmpty(System.Collections.Generic.IEnumerable)'.
>  There is no boxing conversion or type parameter conversion from 'V' to
>  'System.IEquatable'.
> 
> 
> 

I'm sure I've made a silly mistake, but I can't see it. Could anyone point it out for me please?