IList.Cast<typeof(T)>() возвращает ошибку, синтаксис выглядит нормально

StackOverflow https://stackoverflow.com/questions/43126

Вопрос

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 ....кто-нибудь может увидеть здесь вопиющую ошибку?

Это было полезно?

Решение

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

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

public static T[] LoadObjectListAll()
{
    var session = GetNewSession();
    var criteria = session.CreateCriteria(typeof(T));
    var results = criteria.List<T>();
    return results.ToArray();        
}

Другие советы

Я думаю , что

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

должно быть

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

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

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

Теперь исправлено.

IList есть IList<T>, markdown только что опубликовала его, когда его опубликовала.Я попытался отформатировать его, но я пропустил экранирование <T>.. Исправляю это сейчас.

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

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

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

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

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

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

вместо того, чтобы

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>();

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

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

typeof "принимает" тип и возвращает его System.Type

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

@Jon и @Jonathan - это правильно, но вы также должны изменить возвращаемый тип на

IList<T>

также.Если только это не просто ошибка уценки.

@Джонатан, я полагал, что так оно и было.

Я не уверен, какую версию NHibernate вы используете.Я еще не пробовал золотую версию 2.0, но вы могли бы немного почистить метод, удалив некоторые строки:

public static IList<T> LoadObjectListAll()
{
    ISession session = CheckForExistingSession();
    // Not sure if you can configure a session after retrieving it.  CheckForExistingSession should have this logic.
    // var cfg = new NHibernate.Cfg.Configuration().Configure();
    var criteria = session.CreateCriteria(typeof(T));
    return criteria.List<T>();
}

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

Таким образом, сигнатура вашего метода должна быть:

public static IList<T> LoadObjectListAll()
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top