IList.Cast()返回错误,语法看起来正常

时间:2020-03-05 18:47:26  来源:igfitidea点击:
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时遇到了构建错误。有人在这里看到明显的错误吗?

解决方案

回答

我认为

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

应该

var castList = list.Cast<T>();
@Jon Limjap The most glaring error I can see is
  that an IList is definitely different from an IList<T>. An IList is non-generic
  (e.g., ArrayList).

最初的问题已经在使用IList &lt;T>。有人编辑格式时将其删除。 Markdown可能是一个问题。

现在已修复。

回答

T已经是一个类型参数,我们无需在其上调用typeof。 TypeOf接受一个类型并返回其type参数。

回答

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

回答

我看到的最明显的错误是,IList绝对不同于IList &lt;T>。 IList是非泛型的(例如ArrayList)。

因此,方法签名应为:

public static IList<T> LoadObjectListAll()

回答

IList是一个IList <T>,刚发布时就被markdown所欺骗。我试图格式化它,但是我错过了转义<T>的问题。现在修复该问题。

回答

T不是类型,也不是System.Type。 T是一个类型参数。 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();        
}

回答

CLI仅在使用委托时支持协变和矛盾的泛型参数,但是在使用泛型时存在一些限制,例如,我们可以将字符串强制转换为对象,因此大多数人会假设我们可以使用List <string>到List <object>中,但是我们不能这样做,因为通用参数之间没有协方差,但是我们可以模拟协方差,如本文中所见。因此,它取决于抽象工厂生成的运行时类型。

回答

CLI only supports generic arguments for covariance and contravariance when using delegates, but when using generics there are some limitations, for example, you can cast a string to an object so most people will assume that you can do the same with List to a List but you can't do that because there is no covariance between generic parameters however you can simulate covariance as you can see in this article. So it depends on the runtime type that it is generated by the abstract factory.

读起来就像是马尔科夫链子……布拉沃。

回答

"最初的问题已经在使用IList &lt;T>。当有人编辑格式时,它已被删除。Markdown可能有问题。"

那就是我所看到的,但是它是由某人编辑的,这就是为什么我对协方差进行解释的原因,但由于某种原因,我被标记为-1.

回答

@乔纳森·霍兰德

T is already a type parameter, you don't need to call typeof on it. TypeOf takes a type and returns its type parameter.

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

回答

临时变量过多,令人困惑

代替

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