Edit
Okay ... I think now I see your confusion. You would expect DoStuff (string) to save the parameter as a string and first enumerate the BaseClass methods list, looking for a suitable signature, and fail to reject an attempt to apply this parameter to another type.
But it happened the other way around ... Instead of Container.DoStuff(string) went, meh "theres a base class method there that is suitable for counting, but I'm going to convert to IEnumerable and have a heart attack about what's available in the current class instead. ..
Hmmm ... I'm sure John or Mark will be able to call back at this point with a specific C # Spec paragraph covering this particular corner case
Original
Both methods expect IEnumerable Collection
You pass a separate line.
The compiler takes this line and goes,
Ok, I have a string, Both methods expect IEnumerable<T> , so I will turn this string into IEnumerable<char> ... Done
Right, check out the first method ... hmmm ... this is a Container<string> class, but I have an IEnumerable<char> so that it doesn't go right.
Check out the second method, hmm ... have an IEnumerable<char> , but char does not implement the string, so it is also wrong.
COMPUTER ERROR
So, what a fix, well, it totally depends on what you are trying to achieve ... both of them would be valid, in fact, using your types is just wrong in your incarnation.
Container<char> c1 = new Container<char>(); c1.DoStuff("Hello World"); Container<string> c2 = new Container<string>(); c2.DoStuff(new List<string>() { "Hello", "World" });