Cześć. Dla obrazowej reprezentacji mojego problemu przyjmijmy taki model:

class Vehicle : IStrategyProvider<Vehicle>
{
}

class Car : Vehicle
{
}

Natomiast sedno jest tu:

interface IStrategyProvider<out T>
{
    IStrategy<T> Strategy { get; }
}

interface IStrategy<in T>
{
    Start(T obj);
}

i gdzie indziej implementacja:

class CarEngine : IStrategy<Car>
{
}

Oczywiście takie deklaracje interfejsów się nie skompilują. Bo raz T jest wejściowym innym razem wyjściowym typem. out przy IStrategyProvider jest niezbędny, ponieważ taki warunek:

if(myObj is IStrategyProvider<Vehicle>)

musi być prawdziwy dla obiektów klas Vehicle oraz Car.

Mam nadzieje, że udało mi się wyjaśnić na czym polega mój problem. Najważniejszy jest ten warunek, jeśli zrobiłem błąd przy konstrukcji samych interfejsów to mogę je zmienić, natomiast warunku nie.