zoukankan      html  css  js  c++  java
  • C#中如果类的扩展方法和类本身的方法签名相同,那么会优先调用类本身的方法

    新建一个.NET Core项目,假如我们有如下代码:

    using System;
    
    namespace MethodOverload
    {
    
        static class DemoExtension
        {
            public static int GetNumber(this Demo d,int i)
            {
                Console.WriteLine("DemoExtension GetNumber was called!");
                return i;
            }
        }
    
    
        class Demo
        {
            public int GetNumber(int i)
            {
                Console.WriteLine("Demo GetNumber was called!");
                return i;
            }
        }
    
    
        class Program
        {
            static void Main(string[] args)
            {
                Demo demo = new Demo();
    
                demo.GetNumber(100);
    
                Console.WriteLine("Press any key to end...");
                Console.ReadLine();
            }
        }
    }

    我们可以在VisualStudio中看到demo.GetNumber方法有一个重载:

    一个是Demo类中定义的GetNumber方法,还有个是DemoExtension类中定义的GetNumber扩展方法,那么我们在调用demo.GetNumber(100)时,到底调用的哪个方法呢?

    执行结果如下:

    可以看到是Demo类中定义的GetNumber方法被调用了,所以如果说有扩展方法和类本身的方法签名相同,C#会优先调用类本身的方法。

    假如现在我们注释掉Demo类中定义的GetNumber方法:

    using System;
    
    namespace MethodOverload
    {
    
        static class DemoExtension
        {
            public static int GetNumber(this Demo d,int i)
            {
                Console.WriteLine("DemoExtension GetNumber was called!");
                return i;
            }
        }
    
    
        class Demo
        {
            //public int GetNumber(int i)
            //{
            //    Console.WriteLine("Demo GetNumber was called!");
            //    return i;
            //}
        }
    
    
        class Program
        {
            static void Main(string[] args)
            {
                Demo demo = new Demo();
    
                demo.GetNumber(100);
    
                Console.WriteLine("Press any key to end...");
                Console.ReadLine();
            }
        }
    }

    现在执行结果如下:

    这次我们看到调用的就是DemoExtension类中定义的GetNumber扩展方法了

  • 相关阅读:
    Visual Studio 2010的活动,有兴趣的朋友可以来参加
    .NET 业务框架开发实战之九 Mapping属性原理和验证规则的实现策略
    Javascript 返回上一页
    Entity Framework 4.0新增对TSQL的支持
    .Net 4.0中支持的更加完善了协变和逆变
    c#4.0——泛型委托的协变、逆变
    JQuery 常用方法基础教程
    AspNetPager分页示例
    微软一站式示例代码浏览器
    UI与实体的映射
  • 原文地址:https://www.cnblogs.com/OpenCoder/p/9805348.html
Copyright © 2011-2022 走看看