17、委托
当方法绑定到委托时,C#和CLR都允许引用类型的协变性和逆变性。
协变性是指方法能返回从委托的返回类型派生的一个类型。
逆变性是指方法获取的参数可以是委托的参数类型的基类。
例如下面这个委托
delegate object MyCallback(FileStream fs);
完全可以构造委托类型的一个实例并绑定具有以下原型的方法
string SomeMethod(Stream s)
在这里,SomeMethod的返回类型(string)派生自委托的返回类型(Object),这种协变性是允许的。
SomeMethod的参数类型(Stream)是委托的参数类型(FileStream)的基类,这种逆变性是允许的。
注意,只有引用类型才支持协变性和逆变性,值类型或void不支持
回调代码引用类定义的其它成员
private static void UseLocal(int num) { int[] ints = new int[num]; AutoResetEvent done = new AutoResetEvent(false); for (int i = 0; i < ints.Length; i++) { ThreadPool.QueueUserWorkItem(obj => { int a = (int)obj; ints[a] = a * a; if (Interlocked.Decrement(ref num) == 0) { done.Set(); } }, i); } done.WaitOne(); for (int i = 0; i < ints.Length; i++) { Console.WriteLine("index {0} , ints={1}", i, ints[i]); } }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了