当方法绑定到委托时,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]); } }