首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >函数,可以返回任何类型的列表。

函数,可以返回任何类型的列表。
EN

Stack Overflow用户
提问于 2018-07-10 23:33:38
回答 3查看 1.3K关注 0票数 1

我正在编写一个函数,其中给定一个DataTable,该函数应该识别该类型,并将datatable转换为其类型的列表。但我的问题是,每当我返回列表时,我就会得到一个错误:

不能隐式转换类型

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
'System.Collections.Generic.List<ADMPortal_2.Modles.ProductionPending>' 

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
'System.Collections.Generic.List<T>'

现在,如何创建一个可以返回任何类型list<>的函数?

例如:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
List<ProductionPending>
List<ProductionRecent>
List<MirrorDeployments>

函数

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public List<T> ConvertToList<T>(DataTable dt, int listType)
    {

        if (listType == 1)
        {
            List<ProductionPending> list = new List<ProductionPending>();
            list = ConvertToProductionPending(dt);
            return list; 
        }
        else if (listType == 2)
        {
            List<ProductionRecent> list = new List<ProductionRecent>();
            ConvertToProductionRecent(dt);
            return list; 
        }
        else if (listType == 3)
        {
            List<MirrorDeployments> list = new List<MirrorDeployments>();
            list = ConvertToMirror(dt);
            return list; 
        }
        return list;
    }

调用函数

下面的代码是调用上述函数的经典方法。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
        using (OracleConnection conn = new OracleConnection(cnnStr))
        {
            using (OracleCommand objCommand = new OracleCommand(strSql, conn))
            {
                objCommand.CommandType = CommandType.Text;
                DataTable dt = new DataTable();
                OracleDataAdapter adp = new OracleDataAdapter(objCommand);
                conn.Open();
                adp.Fill(dt);
                if (dt != null)
                {

                    list = ConvertToList<T>(dt, 1).ToList();
                }
            }
        }
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-07-10 23:59:44

你的方法的问题是你的类型没有太多的共同点。仅仅因为某些类具有某种继承关系,并不意味着该类的列表具有相同的关系。换句话说:List<Derived>不能转换为List<Base>

如果List<T>是协变的,那么您可以实现这一点--这不是因为以下原因。想象一下,您的ConvertToList-method的一个客户端做了这样的事情:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
var list = ConvertToList<MyBaseClass>(theTable, 1)

现在,您还可以执行以下操作:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
list.Add(new ProductionRecent());

这可能不是你想要的。因此,您需要一些只读的集合,这意味着您不能向其中添加实例。因此,IEnumerable<T>-interface是协变的,可以用作方法的返回类型。

票数 2
EN

Stack Overflow用户

发布于 2018-07-10 23:45:57

IEnumerable在其泛型类型中使用out关键字,因此您可以使用派生类型作为回报。那么像这样的事情怎么样:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
        public static IEnumerable<IBase> ConvertToList(int listType)
    {

        if (listType == 1)
        {
            var list = new List<ClassA>();
            ...
            return list;
        }
        if (listType == 2)
        {
            var list = new List<ClassB>();
            ...
            return list;
        }
        if (listType == 3)
        {
            var list = new List<ClassC>();
            ...
            return list;
        }
        return null;
    }
}

public class ClassA : IBase
{ }
public class ClassB : IBase
{ }
public class ClassC : IBase
{ }
public interface IBase
{ }

更多信息在这里:广义协方差与反方差

票数 0
EN

Stack Overflow用户

发布于 2018-07-10 23:50:39

正如您所说的,它们有一个共同的基类:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public List<CommonBaseClass> ConvertToList(DataTable dt, int listType)
{
    var result = List<CommonBaseClass>();

    if (listType == 1)
    {
        result.AddRange(ConvertToProductionPending(dt));
    }
    else if (listType == 2)
    {
        result.AddRange(ConvertToProductionRecent(dt));
    }
    else if (listType == 3)
    {
        result.AddRange(ConvertToMirror(dt));
    }

    return result;
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51279679

复制
相关文章
【类型挑战】获取函数返回类型,难度⭐️⭐️
Dear,大家好,我是“前端小鑫同学”,😇长期从事前端开发,安卓开发,热衷技术,在编程路上越走越远~ 知识运用: 认识什么是returntypetype。 题目分析: 题目地址:2-medium-return-type 如上图所示,我们需要设计一个通用了类型工具还提取函数类型的返回类型,功能同内置的ReturnType。 题目解答: 测试用例: 给出的测试用例挺多但是没有特殊需要说明的,我们只需要通过设计的类型工具取出到通过Equal来进行比较即可。 /* _____________ 测试用例 _
前端小鑫同学
2022/12/26
1.2K0
【类型挑战】获取函数返回类型,难度⭐️⭐️
习题21:函数可以返回东西
注释:上面例子,创建了加减乘除数学函数:add,subtract,multiply,以及divide 重要的是函数的最后一行,例如add的最后一
py3study
2018/08/02
2680
函数出错返回的数据类型
返回NULL值有各种弊端,对此有一个比较经典的应对策略,就是应用空对象设计模式(Null Object Design Pattern)。
WindCoder
2020/04/09
2.2K0
父类返回子类类型的函数写法
我们有这么一个类,一看就是要写 Builder 模式。不过由于我们的这个 Event 的类型比较多,因此希望写一个父类,来一个子类感受下:
bennyhuo
2020/02/20
4.8K0
【Kotlin】函数 ③ ( 匿名函数 | 匿名函数的函数类型 | 匿名函数的隐式返回 )
Kotlin 中对 CharSequence 类进行了扩展 , 定义了 count(predicate: (Char) -> Boolean) 扩展函数 , 接收一个 (Char) -> Boolean 类型的函数 , 用于 返回匹配给定 匿名函数 的字符数 ;
韩曙亮
2023/03/30
3.1K0
【Kotlin】函数 ③ ( 匿名函数 | 匿名函数的函数类型 | 匿名函数的隐式返回 )
基于 Python 的 Crypter 可以绕过任何类型的防病毒产品
在 github 上查找任何基于 Python 的后门/RAT。 用 pycrypt 加密它的有效载荷 现在使用 pyinstaller 将加密的有效负载转换为 exe KleenScan 扫描仪结果 生成的 stub.py 结果:-https://kleenscan.com/scan_result/39e61c692ee91dd6cd48aca77a8bb220ef27fcc40df75807d4a1f96b4db8df69 加密代码结果:-https://kleenscan.com/scan_res
Khan安全团队
2023/02/23
4200
基于 Python 的 Crypter 可以绕过任何类型的防病毒产品
【Kotlin】函数 ⑧ ( 函数引用 作为函数参数 | ::函数名 | 函数类型 作为函数返回值类型 )
函数引用 可以将 具名函数 转为 函数的参数值 , 只要可以使用 Lambda 表达式 参数的地方 , 就可以使用 函数引用 进行替代 ;
韩曙亮
2023/03/30
2.9K0
【Kotlin】函数 ⑧ ( 函数引用 作为函数参数 | ::函数名 | 函数类型 作为函数返回值类型 )
【Python】类型注解 ④ ( 函数类型注解 | 函数形参类型注解语法 | 函数返回值类型注解 )
由于定义 函数 时 , 没有为 函数形参 设置 类型注解 , 编写函数时 , PyCharm 工具无法提示没有类型的形参 :
韩曙亮
2023/10/11
3750
【Python】类型注解 ④ ( 函数类型注解 | 函数形参类型注解语法 | 函数返回值类型注解 )
Golang 函数返回类型是接口时返回对象的指针还是值
Interface 是一组抽象方法(未具体实现的方法,仅包含方法名参数返回值的方法)的集合,如果实现了 interface 中的所有方法,即该类型就实现了该接口。
恋喵大鲤鱼
2019/06/14
8.1K0
【Kotlin】函数类型 ( 函数类型 | 带参数名称的参数列表 | 可空函数类型 | 复杂函数类型 | 带接收者函数类型 | 函数类型别名 | 函数类型实例化 | 函数调用 )
函数类型格式 : 圆括号中定义 参数类型列表 , 使用 -> 由参数列表指向返回值类型 , 表示接受 参数类型列表 中的参数 , 返回 返回值类型 的返回值 ;
韩曙亮
2023/03/27
2.8K0
Python常看函数用法,返回值类型
在面向对象编程中,python 类有多继承特性,如果继承关系太复杂,很难看出会先调用那个属性或方法。
北山啦
2022/10/31
1.1K0
(十四)给函数返回值添加类型
在 TypeSctipt 中可以自动对返回值进行类型的推断,当然也可以手动限定返回值
老怪兽
2023/02/22
9580
mybatis返回值为map类型时怎么处理_构造函数不能有返回类型
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
全栈程序员站长
2022/11/09
1.8K0
mybatis返回值为map类型时怎么处理_构造函数不能有返回类型
C语言指针做函数参数,指针做函数返回类型
有时候我们可以使用函数的返回值来回传数据,在简单的情况下是可以的,但是如果返回值有其它用途(例如返回函数的执行状态量),或者要回传的数据不止一个,返回值就解决不了了,所以要引用上指针来传递。
C语言中文社区
2022/11/08
2.6K0
C语言指针做函数参数,指针做函数返回类型
C++模板取函数参数类型和返回值类型的方法
static_assert(is_same_v<decltype(f), int(int, short, float)>);
用户7886150
2021/02/03
4.2K0
Python 字符串中返回bool类型的函数集合
字符串中返回bool类型的函数集合 isspace 功能: 判断字符串是否是由一个空格组成的字符串 用法: booltype = string.isspace() -> 无参数可传 ,返回一个布尔类型 注意: 由空格组成的字符串,不是空字符串 : “’!=‘’’ istitile 功能: 判断字符串是否是一个标题类型 用法 booltype = String.istitle() -> 无参数可传, 返回一个布尔类型 注意: 该函数只能用于英文 isupper与islower 功能: isupper判断字
Zkeq
2022/05/18
2.4K0
【Kotlin】函数 ② ( Unit 函数 | TODO 函数抛出异常返回 Nothing 类型 | 反引号函数名 )
Kotlin 语言 中 没有返回值的函数 其返回类型是 Unit , 该函数又称为 Unit 函数 ;
韩曙亮
2023/03/30
9120
【Kotlin】函数 ② ( Unit 函数 | TODO 函数抛出异常返回 Nothing 类型 | 反引号函数名 )
列表类型
序列是python中最基本的数据结构.序列中的每个元素都分配一个数字(它的位置或索引),第一个索引是0,第二个索引是1,一次类推.
py3study
2020/01/20
4840
【Python】函数进阶 ① ( 函数返回多个返回值 | 函数参数传递类型简介 | 位置参数 | 关键字参数 )
在函数中 , 如果要 返回 多个返回值 , 可以 在 return 语句中 , 设置多个返回值 , 这些返回值之间使用 逗号 隔开 , 这些返回值的类型是 元组 tuple 类型的 ;
韩曙亮
2023/10/11
1.6K0
什么?函数类型重载还可以动态生成?
函数可以用 interface 的方式声明,同样,也可以用 interface 的方式声明函数重载:
神说要有光zxg
2022/04/12
3320
什么?函数类型重载还可以动态生成?

相似问题

不带任何返回类型的函数

30

函数返回任何类型的指针?

14

如何设置函数的类型,该函数是函数参数,可以具有任何参数和任何返回

23

可以执行任何类型的函数的函数

11

定义返回任何类型的命名函数类型

215
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文