Общий интерфейс компилируется, но не работает во время выполнения - PullRequest
1 голос
/ 12 декабря 2011

У меня проблема с универсальным интерфейсом.Компилятор не выдает никаких ошибок компиляции, но во время выполнения генерируется невидимое исключение.

public interface IStructure
{
    string Name {get;}
}

public interface IStructureNavigation<T> : IStructure where T : IStructure
{
    T Parrent {get;}
}


public class ResourceStructure : IStructureNavigation<ResourceStructure>
{
    private ResourceStructure _parrent;

    public virtual string Name
    {
        get;
        set;
    }

    public virtual ResourceStructure Parrent
    {
        get { return _parrent; }
    }

}

Может кто-нибудь объяснить, почему следующий код не работает во время выполнения?

public class Action
{
    private ObjectContext _context;
    private ObjectSet<ResourceStructure> _structue;
    private IQueryable<ResourceStructure > _parrents;

    public Action()
    {
        string connectionString =
             ConfigurationManager
            .ConnectionStrings["Structure"].ConnectionString;

        _context = new ObjectContext(connectionString);
        _context.ContextOptions.LazyLoadingEnabled = true;

        _structue = _context.CreateObjectSet<ResourceStructure>();
        _parrents = _structue.Where(x => x.ParentID == null);


       // FAILS IN FOREACH LOOP : UNSEEN EXCPTION
       foreach (IStructureNavigation<IStructure> strt in _parrents)
        {
            //do something
        }


       //WORKS IF USING CONCRETE TYPE NOT INTERFACE
       foreach(IStructureNavigation<ResourceStructure > strt in _parrents)
        {
            //do something
        }
    }
}

Ответы [ 2 ]

4 голосов
/ 12 декабря 2011

Объявить T ковариантным

  public interface IStructureNavigation<out T> : IStructure where T : IStructure
0 голосов
/ 12 декабря 2011

Это потому, что ваш экземпляр имеет тип IStructureNavigator<ResourceStructure>, а не IStructureNavigator<IStructure>.

Если вам нужно использовать интерфейс, вы можете использовать метод расширения Cast:

_parrents =  _context.CreateObjectSet<ResourceStructure>().Cast<IStructure>();

Какую версию Framework вы используете?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...