【问题标题】:C# method overloading depend on signature or number of parameters?C# 方法重载取决于签名或参数数量?
【发布时间】:2012-01-24 11:10:37
【问题描述】:

请指导我使用 C# 方法重载:它取决于方法签名、返回类型或参数数量吗?要说一个方法正在或可以被重载,哪些变化是必不可少的?

谢谢

【问题讨论】:

    标签: c# .net oop polymorphism overloading


    【解决方案1】:

    这取决于签名 - 即参数的数字和类型

    你可以有不同的重载,参数数量相同,但类型。例如,请参阅Convert 类 - 方法的许多重载采用一个参数,但每个重载采用不同的类型。

    【讨论】:

    • 感谢 Oded,我们会说什么签名?返回类型也是签名的一部分吗?今天面试,被问到这个问题。我们可以说它取决于签名或参数数量吗?
    • @haansi - 不,签名不包括返回类型。
    【解决方案2】:

    重载考虑了数量、顺序和参数的类型。 重载时不考虑返回类型

    注意,有一个例外: 如果某个方法在某些类中被覆盖,c# 会首先尝试在被覆盖的类中找到兼容的版本,然后只会在祖先中查找。 例如

    Class A
    {
      public virtual void SetProperty(string value)
      {
      }     
    }
    
    Class B: Class A
    {
      public override void SetProperty(object value)
      {
      }
    }
    

    如果您执行以下操作

      var b= new B();
      b.SetProperty("hello"); // will resolve to overridden method in class B even though you have a more specific version in its parent (class A)
    

    【讨论】:

    • 这是方法重载,而不是重载!
    【解决方案3】:

    如果你的意思是重载分辨率,它取决于:

    • 方法的名称:)
    • 参数个数
    • 参数的类型
    • 参数的名称(如果您使用命名参数)
    • 参数是否可选
    • 类型参数个数

    创建重载方法而言,参数的名称和“可选性”是不相关的,因此例如这是无效的:

    // Not valid: same signature
    void M(int x, string y)
    void M(int z, string a = "")
    

    它们在方法名称、类型参数数量以及参数计数和类型方面具有相同的签名。

    【讨论】:

    • 谢谢乔恩,请指导方法重载是否取决于方法签名或参数数量?我今天在采访中遇到了这个问题,我不确定并且想知道。谢谢
    • @haansi:参数个数是签名的部分
    【解决方案4】:

    如果参数数量不同或参数类型不同,则称方法已重载,但如果仅方法的返回类型不同(不会编译),则不能重载。

    例如低于 3 的被称为重载,而第 4 个不会被称为重载,如果存在其他 3,则甚至不会编译:

    public int Add(int a, int b); // Method 1, overloaded
    public int Add(int a, int b, int c); // Method 2, overloaded
    public int Add(double a, double b); // Method 3,  overloaded
    
    public double Add(double a, double b); // Method 4 (invalid, will conflict with Method 3 above)
    

    根据MSDNSignatures and overloading (C#)

    方法的签名由方法的名称和每个形式参数的类型和种类(值、引用或输出)组成,按从左到右的顺序考虑。方法的签名明确地不包括返回类型,也不包括可能为最右边的参数指定的 params 修饰符。

    【讨论】:

    • 感谢 Vijay,请指导方法重载是否取决于方法签名或参数数量?我今天在采访中遇到了这个问题,我不确定并且想知道。谢谢
    • @haansi :实际上它依赖于两者,但据说 重载或方法签名 取决于参数的数量和类型,而不是返回类型。应该这样问:方法重载是取决于方法的返回类型还是方法的参数?我已经用 MSDN 中的方法签名和重载链接更新了答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-11-19
    • 2018-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多