Automatic .ToString()?

.net, c#, interface, tostring

Solution

This follows the rules of the C# language specification around string concatenation. See section 7.8.4 of the C# 4 spec (the addition operator)

String concatenation:

string operator +(string x, string y);
string operator +(string x, object y);
string operator +(object x, string y);

These overloads of the binary `+` operator perform string concatenation. If an operand of string concatenation is`null`, an empty string is substituted. Otherwise, any non-string argument is converted to its string representation by invoking the virtual `ToString` method inherited from type object. If `ToString` returns `null`, an empty string is substituted.

If you didn't expect that to happen, may I ask what you expected the result of the `"abcdef" + c1` expression to be?

Note that `m1`, `IClass2` and `Class2` are irrelevant to what's happening here - it's only the concatenation expression which is really relevant: that's what's triggering the call to `ToString()`, regardless of what's later happening to that string.

Problem

I have a method like this: `void m1(string str)` and have a class like this: ``` public class MyClass { public bool b1 { set; get; } //and other properties } ``` Now why following code does not cause compile error? ``` IClass2 _class2 = new Class2(); MyClass c1 = new MyClass(); _class2.m1("abcdef" + c1); ``` When I debug it, I realized that `c1.ToString()` has been passed to `m1`. Why this automatic `.ToString()` has been occurred? The only thing I could say is that m1 has been defined in `IClass2` interface and has been implemented by `Class2`.

Original source