IList.Cast<typeof(T)>()返回错误,语法看起来没问题。

4
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
T不是一个类型也不是System.TypeT是一个类型参数。typeof(T)返回T的类型。 typeof运算符不作用于对象,而是返回类型的Type对象。http://msdn.microsoft.com/en-us/library/58918ffs.aspx @John在回答你的直接问题时是正确的。 但是NHibernate代码有点不对。例如,在获取ISession之后,您不应该配置ISessionFactory
public static T[] LoadObjectListAll()
{
    var session = GetNewSession();
    var criteria = session.CreateCriteria(typeof(T));
    var results = criteria.List<T>();
    return results.ToArray();        
}

5

我认为

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

应该是

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

@Jon Limjap 我能看到的最明显的错误是,IList 绝对不同于 IList<T>。一个 IList 是非泛型的(例如 ArrayList)。

原始问题已经在使用 IList<T>。当有人编辑格式时,它被删除了。可能是 Markdown 的问题。

现在已经修复。


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

1

T已经是一个类型参数,您不需要对其调用typeof。TypeOf接受一个类型并返回其类型参数。


你错了。typeof需要一个编译时类型标识符,并返回它的System.Type实例。 - SLaks

1

IList 是一个 IList<T>,她发布时被 markdown 弄糊了。我试图格式化它,但我错过了转义 <T>..现在正在修复。


1
CLI仅在使用委托时支持协变和逆变的通用参数,但在使用泛型时存在一些限制。例如,您可以将字符串转换为对象,因此大多数人会认为您可以将List转换为List,但是您不能这样做,因为没有泛型参数之间的协变性。但是,您可以模拟协变性,正如您在本文中所看到的那样。因此,它取决于由抽象工厂生成的运行时类型。

1

原始问题已经使用了 IList<T>。当有人编辑格式时,它被删除了。可能是 Markdown 的问题。

这就是我看到的,但它被某人编辑了,这就是为什么我解释协变性的原因,但由于某种原因,我被评为 -1 分。


1

@乔纳森·荷兰

T 已经是一种类型参数,您不需要在它上面调用 typeof。TypeOf 接受一个类型并返回其类型参数。

typeof “接受”一个类型并返回其 System.Type


0

@Jon 和 @Jonathan 是正确的,但你还需要将返回类型更改为

IList<T>

另外,除非这只是一个Markdown错误。

@Jonathan,我想那就是情况。

我不确定您正在使用哪个版本的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>();
}

0

CLI只在使用委托时支持协变和逆变的通用参数,但在使用泛型时存在一些限制,例如,你可以将字符串强制转换为对象,因此大多数人会认为你可以将 List<string> 转换为 List<object>,但实际上你不能这样做,因为泛型参数之间没有协变性。然而,你可以模拟协变性,正如你可以在这篇 文章 中看到的那样。因此,它取决于由抽象工厂生成的运行时类型。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接