2015-01-18 2 views
0

Приведенный ниже код дает ошибку компиляции времени:Кастинг Generic абстрактной базы - ковариационная

Ошибка 170 Не удается преобразовать тип «Tests.ChangeListener» до «Tests.BaseListener»

Как я могу получить это составить?

namespace Tests 
{ 
    [TestClass] 
    public class UnitTest1 
    { 
     [TestMethod] 
     public void ShouldCompile() 
     { 
      BaseListener<IChange> listener = (BaseListener<IChange>)new ChangeListener(); 
     } 
    } 

    public interface IChange 
    { 
    } 

    public interface ISpecificChange : IChange 
    { 
    } 

    public abstract class BaseListener<T> 
    where T : IChange 
    {  
    } 

    public class ChangeListener : BaseListener<ISpecificChange> 
    { 
    } 
} 

ответ

2

Поскольку вы не можете сделать контравариации или covaraiance (т.е. in и out) на абстрактном классе вы, вероятно, будете хотеть интерфейс для вашего слушателя. Модификация выше, чтобы посмотреть, как это позволяет компилировать (примечание сущности не упоминается остаются теми же, что и исходный код - атрибуты раздели, чтобы сохранить мне необходимости импортировать ссылки во время тестирования):

public class UnitTest1 
{ 
    public void ShouldCompile() 
    { 
     IListener<IChange> listener = new ChangeListener(); 
    } 
} 


public interface IListener<out T> {} 

public abstract class BaseListener<T> : IListener<T> 
where T : IChange 
{  
} 

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

+0

Это исправляет ошибку компилятора. На самом деле мне нужно было сделать экспликацию ChangeListener для слушателя . Но во время выполнения ошибка «Невозможно передать объект типа ...» – LL020

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