Как у вас сейчас, это не может работать.Ваш класс Implementation
реализует IInterface<Parameter>
, поэтому его метод Run
принимает только параметр конкретного типа Parameter
, тогда как IInterface<IParameter>
требует, чтобы его метод Run
принял экземпляр any тип, который реализует IParameter
.
Если разрешен тип приведенных вами типов, я мог бы определить другой класс, который реализует IParameter
, например:
public class DifferentParameter : IParameter { ... }
А затем выполните:
castInstance.Run(new DifferentParameter());
Но ваш Run
метод Implementation
не может принять DifferentParameter
!
.NET, поэтому не позволяет вам выполнить саму приведение.
Существуют ситуации, в которых разрешен этот тип приведения - если бы вместо этого ваш интерфейс был определен как:
interface IInterface<out TOutput>
where TOutput : IResult
{
TOutput Run();
}
Путем задания универсального параметра out
, он делает интерфейс ковариантны .Это ограничивает использование параметра типа в результате вызовов методов, но для ковариантных интерфейсов приведение типа вашего допускается .
Вы можете найти множество документации по ковариации и контравариантности в .NET документация .