gpt4 book ai didi

c# - IEnumerable 和 IQueryable 的通用方法

转载 作者:太空宇宙 更新时间:2023-11-03 18:07:25 26 4
gpt4 key购买 nike

我试图制作一个通用方法来分页 IEnuemrable<T>IQueryable<T>

像这样:

public T Paginate<T, TS>(T list) where T : IEnumerable<TS>
{
CheckValidityAndClamp();
return (T)(list.Skip(Page*PageSize).Take(PageSize));
}

当我传入 List<int> 时例如它编译得很好。但是当运行时它给出了一个转换异常:

System.InvalidCastException : An object of type '<TakeIterator>d__3a`1[System.Int32]' can not be converted to the type 'System.Collections.Generic.List`1[System.Int32]'.

这是为什么呢? List<int>工具 IEnumerable<int>那么为什么要强制转换异常呢?

最佳答案

您不会返回列表。 Take 是用迭代器 block 实现的,这意味着实际类型是没有编译时标识符的类型(这就是它看起来很奇怪的原因)并且它实现了 IEnumerable。它不是您要将其转换到的 List

最重要的是,您的方法不能实际上适用于任何IQueryable 对象。它正在调用接受 IEnumerableSkip 的实现(因为这是通用约束告诉编译器它必须实现的内容)所以如果它是 IQueryable(即使您解决了困惑的转换问题)您也不会使用查询提供程序来翻译 Skip 调用。这里需要有两个重载,一个用于IQueryable,一个用于IEnumerable;这几乎是问题的固有问题,因为您需要调用两种 SkipTake 方法,IEnumerable可查询

关于c# - IEnumerable<T> 和 IQueryable<T> 的通用方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24655909/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com