none
c# 为什么委托中匿名方法不能逆变 RRS feed

  • 问题

  • namespace CSharpStudy
    {
        class EventSample
        {
            public event MyEventHandler SomeEvent;
            public void OnSomeEvent()
            {
                if (SomeEvent != null)
                {
                    SomeEvent(new ChildClass());
                }
            }
        }
    
        class BaseClass { }
    
        class ChildClass : BaseClass { }
    
    
        delegate BaseClass MyEventHandler(ChildClass cc);
    
    
     class Program
        {
    
            static int Main(string[] args)
            {
    
                EventSample es = new EventSample();
                es.SomeEvent += delegate(ChildClass bc)//正常
                {
                    Console.WriteLine("this is a third event sample");
                    return new ChildClass();
                };
                es.SomeEvent += (BaseClass bc) =>//产生错误了
                {
                    Console.WriteLine("this is a third event sample");
                    return new ChildClass();
                };
                es.SomeEvent += Program.handler;//正常
                es.OnSomeEvent();
    
    
    
    
                Console.ReadLine();
                return 0;
            }
    
            static ChildClass handler(BaseClass bc)
            {
                Console.WriteLine("this is a third event sample");
                return new ChildClass();
            }
    
    
        }
    }
    
    在委托中用了匿名方法和lambda表达式,不知脑子一热 想试一下 协变和逆变,结果  以显示定义的方法的逆变可以正常,而匿名方法和lambda表达式实现的逆变完全不行(编译不通过),不管那种方式 协变 都是正常的,这到底是为什么呢?求解释!!!
    2013年12月30日 3:47

答案

  • 我之前也是对逆变和协变了解的不是太深入,也没有注意到你说的这个问题。 今天经过很长时间的温习和学习,又在网上进行了大量的搜索,最后发现匿名方法和Lambda表达式是不支持参数的逆变的,它们的参数签名必须和对应的委托的参数签名一致才行。

    请参考这篇英文帖子:

    http://stackoverflow.com/questions/12228859/c-sharp-delegate-contravariance-with-lambda-expression

    C#语言规范第6.6节中已经标明了。


    We are trying to better understand customer views on social support experience, so your participation in this interview project would be greatly appreciated if you have time. Thanks for helping make community forums a great place.
    Click HERE to participate the survey.

    2013年12月31日 8:09
    版主