c# – 隐式方法组转换getcha

前端之家收集整理的这篇文章主要介绍了c# – 隐式方法组转换getcha前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我想知道为什么给定代码输出(在 LinqPad中执行)
  1. void Main() {
  2. Compare1((Action)Main).Dump();
  3. Compare2(Main).Dump();
  4. }
  5.  
  6. bool Compare1(Delegate x) {
  7. return x == (Action)Main;
  8. }
  9.  
  10. bool Compare2(Action x) {
  11. return x == Main;
  12. }

总是:

  1. False
  2. True

在这两种情况下,我都天真地期望它是真的.

解决方法

这是编译到IL然后反编译回C#时的外观.请注意,在这两种情况下,都有新的Action(Main) – 一个新的引用对象(delegate),其中包含指向实际存储方法的指针.
  1. private static void Main()
  2. {
  3. Program.Compare1(new Action(Program.Main)).Dump();
  4. Program.Compare2(new Action(Program.Main)).Dump();
  5. Console.ReadLine();
  6. }
  7.  
  8. private static bool Compare1(Delegate x)
  9. {
  10. return x == new Action(Program.Main);
  11. }
  12.  
  13. private static bool Compare2(Action x)
  14. {
  15. return x == new Action(Program.Main);
  16. }

如果我们看看CIL,前者使用ceq(参考比较),后者使用call bool [mscorlib] System.Delegate :: op_Equality(class [mscorlib] System.Delegate,class [mscorlib] System.Delegate)to比较代表

首先返回false,因为包含代理的动作是两个不同的引用对象.

第二个返回true,因为在Delegate类上实现的等号运算符将比较封装(动作)中的实际目标.

猜你在找的C#相关文章