c#中的协变与逆变
首先我们看一下msdn上关于这两个概念的说明:协变允许方法具有的派生返回类型比委托中定义的更多。逆变允许方法具有的派生参数类型比委托类型中的更少。
不知道大家看到这两句话时是怎么理解的,反正我是没有理解清楚,于是放狗查了一下,最终我的理解是:
这些变化是在一个大的原则下进行的,即给程序所需要的范围一个更大的范围。
也许还是不清楚,来看一下小例子吧:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | namespace ConsoleApplication1 { class Program { static void Main( string [] args) { #region covariance test Func< object > covarianceTest1 = () => getObject(); Func< object > covarianceTest2 = () => getString(); #endregion #region contravariance test Action< string > contravarianceTest1 = obj => setObject(obj); Action< string > contravarianceTest2 = str => setString(str); #endregion } private static object getObject() { return null ; } private static void setObject( object obj) { } private static string getString() { return null ; } private static void setString( string str) { } } } |
以Func<object>为例,它是协变事例:covarianceTest2所需的返回类型是一个object类的,但我给它实例化后,确是一个更精确的类型string,这
是好理解的。
以Action<string>为例,它是逆变事例:contravarianceTest1所需的参数类型是一个string类的,但我给它实例化后,确是一个范围更大的类型object。
所有这些都是ms在定义这门语言时设计的,你可以把它当成一个语法记下来。在c#4.0中还专门引进了in, out对这些变化进行处理。如果想理解更加彻底请看下面这两篇围脖吧!
http://hestia.typepad.com/flatlander/2008/12/c-covariance-and-contravariance-by-example.html
http://blogs.msdn.com/b/csharpfaq/archive/2010/02/16/covariance-and-contravariance-faq.aspx
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 软件产品开发中常见的10个问题及处理方法
· .NET 原生驾驭 AI 新基建实战系列:向量数据库的应用与畅想
· 从问题排查到源码分析:ActiveMQ消费端频繁日志刷屏的秘密
· 一次Java后端服务间歇性响应慢的问题排查记录
· dotnet 源代码生成器分析器入门
· ThreeJs-16智慧城市项目(重磅以及未来发展ai)
· .NET 原生驾驭 AI 新基建实战系列(一):向量数据库的应用与畅想
· Ai满嘴顺口溜,想考研?浪费我几个小时
· Browser-use 详细介绍&使用文档
· 软件产品开发中常见的10个问题及处理方法