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
.
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 isnull
, an empty string is substituted. Otherwise, any non-string argument is converted to its string representation by invoking the virtualToString
method inherited from type object. IfToString
returnsnull
, 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.
The compiler turns "abcdef" + c1
into a string.Concat(object,object)
call. This in turn will call .ToString()
on each of the arguments and concatenate them. Here's the code from reflector:
public static string Concat(object arg0, object arg1)
{
if(arg0 == null) arg0 = Empty;
if(arg1 == null) arg1 = Empty;
return (arg0.ToString() + arg1.ToString());
}
Note that the last line involves a call to string.Concat(string, string)
where the real concatenation happens.
来源:https://stackoverflow.com/questions/3759343/automatic-tostring