2014-09-12 3 views
2

Высказывание У меня есть следующие интерфейсыC в интерфейсе

using System; 

public interface IInput 
{ 

} 

public interface IOutput<Shipper> where Shipper : IShipper 
{ 

} 

public interface IShipper 
{ 

} 


public interface IProvider<TInput, TOutput> 
    where TInput : IInput 
    where TOutput : IOutput<IShipper> 
{ 

} 

Я могу создать следующие классы:

public class Input : IInput 
{ 

} 

public class Shipper : IShipper 
{ 

} 

public class Output : IOutput<Shipper> 
{ 

} 

Я пытался несколько способов, чтобы создать класс, реализующий IProvider с не повезло?

Ex:

public class Provider : IProvider<Input, Output> 
{ 

} 
Error: The type 'Output' cannot be used as type parameter 'TOutput' in the generic type or method 'IProvider<TInput,TOutput>'. There is no implicit reference conversion from 'Output' to 'IOutput<IShipper>' 

или

public class Provider : IProvider<Input, Output<IShipper>> 
{ 

} 
Error: The non-generic type 'Output' cannot be used with type arguments 

Как я могу это сделать?

+0

Чтобы следовать соглашениям, 'Shipper' в определении' IOutput 'должен быть' TShipper'. –

ответ

4

Вы пытаетесь обработать общий аргумент Shopper в IOutput, как будто это ковариант. Вы должны явно указать, что этот общий аргумент ковариантен при объявлении интерфейса:

public interface IOutput<out Shipper> where Shipper : IShipper 
{ 

} 

(Обратите внимание на ключевое слово out.)

Затем код компилируется.

Обратите внимание, что после внесения этого изменения вы больше не сможете использовать аргумент общего типа Shipper в качестве параметров для любых членов этого интерфейса; если он будет использоваться в таком усадьбе, тогда интерфейс не будет концептуально ковариантным.

Вы можете немного упростить код, чтобы устранить некоторые проблемы, не имеющие отношения к этой проблеме. Это все сводится к возможности сделать следующее:

IOutput<Shipper> output = new Output(); 
IOutput<IShpper> = output; 

Это преобразование только справедливо, если IOutput ковариантен относительно его родового аргумента.

+0

Не могу сказать лучше. – CSharpie

+0

Я понял. Благодаря! – Baral

Смежные вопросы