Проблема с обобщениями в C # - PullRequest
0 голосов
/ 05 января 2011

Во-первых, я новичок в дженериках.У меня проблема со следующим кодом:

namespace YvanSoftware_V5.Models
{
    public interface ISession : IDisposable
    {
        void CommitChanges();
        Db4objects.Db4o.IObjectContainer Container { get; }
        void Delete(System.Linq.Expressions.Expression<Func< T, bool>> expression);
        void Delete(object item);
        void DeleteAll();
        void Dispose();
        T Single(System.Linq.Expressions.Expression<Func< T, bool>> expression);
        System.Linq.IQueryable All();
        void Save(T item);
    }
}

Я получаю следующую ошибку компиляции, но я не знаю, что это означает в этом контексте.

Тип или имя пространства имен 'T 'не может быть найдено (вам не хватает директивы using или ссылки на сборку?)

Я получил этот код от http://www.itslet.nl/?p=125.

Спасибо за помощь,

Иван

Ответы [ 4 ]

9 голосов
/ 05 января 2011

Это потому что Т не определено. Компилятор попытается найти тип с именем T, который не существует. Попробуйте изменить подпись вашего интерфейса на:

public interface ISession<T> : IDisposable

Если вы не хотите, чтобы весь интерфейс был универсальным, вы можете добавить к каждому методу, например:

Save<T>(T item)

На самом деле, именно этим и занимается автор этого кода, посмотрите на его класс реализации Db4oSession по предоставленной вами ссылке. Правильное определение интерфейса должно быть:

public interface ISession : IDisposable
{
    void CommitChanges();
    Db4objects.Db4o.IObjectContainer Container { get; }
    void Delete<T>(System.Linq.Expressions.Expression<Func< T, bool>> expression);
    void Delete(object item);
    void DeleteAll();
    void Dispose();
    T Single<T>(System.Linq.Expressions.Expression<Func< T, bool>> expression);
    System.Linq.IQueryable All();
    void Save<T>(T item);
}
0 голосов
/ 06 января 2011

Ну, я автор статьи на Ислле. Я просто улучшил код статьи. Кажется, что подсветка синтаксиса убрала мои <T>. Спасибо за уведомление.

0 голосов
/ 05 января 2011

Необходимо определить параметр типа T либо в интерфейсе, либо в методе:

public interface ISession<T> : IDisposable

или

void Delete<T>(System.Linq.Expressions.Expression<Func< T, bool>> expression)
T Single<T>(System.Linq.Expressions.Expression<Func< T, bool>> expression);
void Save<T>(T item);
0 голосов
/ 05 января 2011

Вам необходимо указать T в качестве параметра шаблона для универсальных функций, таких как:

 void Save<T>(T item);

Я бы начал с чего-то более простого для первого использования дженериков.

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