Я написал следующий фрагмент кода, пытаясь обеспечить безопасный для типов интерфейс:
namespace MWE
{
public abstract class C {}
public class A : C {}
public class B : C {}
public class Container<T> where T : C
{
public readonly T Value;
public static implicit operator T(Container<C> c)
{
return c.Value;
}
}
public interface IWrapper<out TC> where TC : C {}
public class Foo
{
public Foo(IWrapper<Container<C>> wrapper) {}
}
}
К сожалению, это не компилируется. * Compiler<C>
-часть параметра wrapper
в конструкторе Foo
заставляет компилятор выдавать следующую ошибку:
Тип «MFE.Container » нельзя использовать в качестве параметра типа «TC» в универсальном типе или методе «IWrapper ». Не существует неявного преобразования ссылок из 'MFE.Container ' в 'MFE.C'.
Тип «MFE.Container » должен быть преобразован в «WeirdTestStuff.C», чтобы использовать его в качестве параметра «TC» в универсальном интерфейсе «MFE.IWrapper ».
Я не могу понять, где именно проблема, поскольку ковариация для преобразования, кажется, существует, и даже существует неявное преобразование из Container<T>
в T
. Начиная с T : C
, я предположил, что это должно просто так работать.
Я бы хотел сохранить конструктор Foo
, как это возможно.
Надеюсь, кто-нибудь подскажет мне решение этой проблемы