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 tha开发者_运维知识库t 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 virtualToStringmethod inherited from type object. IfToStringreturnsnull, 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.
加载中,请稍侯......
精彩评论