Different behaviour of method overloading in C#

后端 未结 3 890
故里飘歌
故里飘歌 2020-12-09 11:14

I was going through C# Brainteasers (http://www.yoda.arachsys.com/csharp/teasers.html) and came across one question: what should be the output of this code?

         


        
相关标签:
3条回答
  • 2020-12-09 11:31

    It revolves around scope. In the first program, void Foo(int i) belongs to class Base. class Derived merely redefines its behavior.

    Foo(int i) is ignored because it's being "borrowed" and redefined via inheritance from class Base. if Foo(object o) did not exist, then Foo(int i) would be used.

    In the second program, void Foo(int i) is called because it properly belongs to class Derived (i.e. it's not being borrowed and overriden through inheritance) and has the best signature fit.

    0 讨论(0)
  • 2020-12-09 11:37

    It's because the methods signatures in the derived class are matched first before considering the base class signatures. Therefore, when you try:

    d.Foo(i);
    

    It attempts to match the method signature against your current class (not the base class). It finds an acceptable match Foo(object) and doesn't further consider the base class method signatures.

    It's all about the compiler finding a matching method signature, and the search order it uses to find these signatures.

    -Doug

    0 讨论(0)
  • 2020-12-09 11:39

    As I specified in the answers page:

    Derived.Foo(object) is printed - when choosing an overload, if there are any compatible methods declared in a derived class, all signatures declared in the base class are ignored - even if they're overridden in the same derived class!

    In other words, the compiler looks at methods which are freshly-declared in the most derived class (based on the compile-time type of the expression) and sees if any are applicable. If they are, it uses the "best" one available. If none is applicable, it tries the base class, and so on. An overridden method doesn't count as being declared in the derived class.

    See sections 7.4.3 and 7.5.5.1 of the C# 3 spec for more details.

    Now as for exactly why it's specified like that - I don't know. It makes sense to me that methods declared in the derived class take precedence over those declared in the base class, as otherwise you run into the "brittle base class" problem - adding a method in the base class could change the meaning of code using the derived class. However, if the derived class is overriding the method declared in the base class, it's clearly aware of it, so that element of brittleness doesn't apply.

    0 讨论(0)
提交回复
热议问题