The following code has a static method, Foo()
, calling an instance method, Bar()
:
public sealed class Example
{
int count;
pub
UPDATE: Below answer was written in 2012, before the introduction of C# 7.3 (May 2018). In What's new in C# 7.3, the section Improved overload candidates, item 1, it is explained how the overload resolution rules have changed so that non-static overloads are discarded early. So the below answer (and this entire question) has mostly only historical interest by now!
(Pre C# 7.3:)
For some reason, overload resolution always finds the best match before checking for static versus non-static. Please try this code with all static types:
class SillyStuff
{
static void SameName(object o) { }
void SameName(string s) { }
public static void Test()
{
SameName("Hi mom");
}
}
This will not compile because the best overload is the one taking a string
. But hey, that's an instance method, so compiler complains (instead of taking the second-best overload).
Addition: So I think the explanation of the dynamic
example of the Original Question is that, in order to be consistent, when types are dynamic we also first find the best overload (checking only parameter number and parameter types etc., not static vs. non-static), and only then check for static. But that means that the static check has to wait until runtime. Hence the observed behavior.
Late addition: Some background on why they chose to do things this funny order can be inferred from this blog post by Eric Lippert.