IList.Cast <typeof (T)> () возвращает ошибку, синтаксис выглядит нормально - PullRequest
4 голосов
/ 04 сентября 2008
public static IList<T> LoadObjectListAll<T>()
{
    ISession session = CheckForExistingSession();
    var cfg = new NHibernate.Cfg.Configuration().Configure();
    var returnList = session.CreateCriteria(typeof(T));
    var list = returnList.List();
    var castList = list.Cast<typeof(T)>();
    return castList;
}

Итак, я получаю сообщение об ошибке сборки, когда я преобразую элемент "list" в общий IList ... Кто-нибудь может увидеть здесь явную ошибку?

Ответы [ 11 ]

7 голосов
/ 04 сентября 2008

T не является ни типом, ни System.Type. T является параметром типа. typeof(T) возвращает тип T. Оператор typeof не действует на объект, он возвращает объект Type типа. http://msdn.microsoft.com/en-us/library/58918ffs.aspx

@ Джон правильно ответил на ваш прямой вопрос. Но код NHibernate там немного не в порядке. Вы не должны настраивать ISessionFactory после , например, получив ISession.

public static T[] LoadObjectListAll()
{
    var session = GetNewSession();
    var criteria = session.CreateCriteria(typeof(T));
    var results = criteria.List<T>();
    return results.ToArray();        
}
5 голосов
/ 04 сентября 2008

Я думаю

var castList = list.Cast<typeof(T)>();

должно быть

var castList = list.Cast<T>();

@ Jon Limjap Самая явная ошибка, которую я вижу, это что IList определенно отличается от IList<T>. IList не является универсальным (например, ArrayList).

В первоначальном вопросе уже использовался IList<T>. Он был удален, когда кто-то отредактировал форматирование. Вероятно, проблема с Markdown.

Исправлено.

1 голос
/ 04 сентября 2008

У вас слишком много временных переменных, которые сбивают с толку

вместо

var returnList = session.CreateCriteria(typeof(T));
var list = returnList.List();
var castList = list.Cast<typeof(T)>();
return castList;

Просто сделай

return session.CreateCriteria(typeof(T)).List().Cast<T>();
1 голос
/ 04 сентября 2008

@ Джонатан Холланд

T уже является параметром типа, вам не нужно вызывать typeof для него. TypeOf принимает тип и возвращает его параметр типа.

typeof «берет» тип и возвращает его System.Type

1 голос
/ 04 сентября 2008

"Исходный вопрос уже использовал IList<T>. Он был удален, когда кто-то отредактировал форматирование. Возможно, проблема с Markdown."

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

1 голос
/ 04 сентября 2008

CLI поддерживает только универсальные аргументы для ковариации и контравариантности при использовании делегатов, но при использовании обобщений есть некоторые ограничения, например, вы можете привести строку к объекту, так что большинство людей будет предполагать, что вы можете сделать то же самое с List to Список, но вы не можете этого сделать, потому что нет никакой ковариации между общими параметрами, однако вы можете смоделировать ковариацию, как вы можете видеть в этой статье. Таким образом, это зависит от типа среды выполнения, который генерируется абстрактной фабрикой.

Это читается как цепочка Маркова ... Браво.

1 голос
/ 04 сентября 2008

IList - это IList , он просто ошеломлен уценкой, когда она отправила его. Я пытался отформатировать его, но мне не хватало экранирования .. Исправляя это сейчас.

1 голос
/ 04 сентября 2008

T уже является параметром типа, вам не нужно вызывать typeof для него. TypeOf принимает тип и возвращает его параметр типа.

0 голосов
/ 04 сентября 2008

CLI поддерживает только обобщенные аргументы для ковариации и контравариантности при использовании делегатов, но при использовании обобщений есть некоторые ограничения, например, вы можете привести строку к объекту, так что большинство людей будет предполагать, что вы можете сделайте то же самое с List<string> до List<object>, но вы не можете этого сделать, потому что нет никакой ковариации между общими параметрами, однако вы можете смоделировать ковариацию, как вы можете видеть в этой статье . Таким образом, это зависит от типа среды выполнения, который генерируется абстрактной фабрикой.

0 голосов
/ 04 сентября 2008

Самая явная ошибка, которую я вижу, это то, что IList определенно отличается от IList<T>. IList не является универсальным (например, ArrayList).

Итак, подпись вашего метода должна быть:

public static IList<T> LoadObjectListAll()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...