C# Automatic.ToString()?

C# Automatic.ToString()?,c#,.net,interface,tostring,C#,.net,Interface,Tostring,我有这样一个方法:voidm1(stringstr),并且有这样一个类: public class MyClass { public bool b1 { set; get; } //and other properties } 为什么下面的代码不会导致编译错误 IClass2 _class2 = new Class2(); MyClass c1 = new MyClass(); _class2.m1("abcdef" + c1); 当我调试它时,我意识到c1.ToStrin

我有这样一个方法:
voidm1(stringstr)
,并且有这样一个类:

public class MyClass
{
    public bool b1 { set; get; }

    //and other properties
}
为什么下面的代码不会导致编译错误

IClass2 _class2 = new Class2();
MyClass c1 = new MyClass();
_class2.m1("abcdef" + c1);
当我调试它时,我意识到
c1.ToString()
已传递给
m1
。为什么会发生此自动
.ToString()
?我唯一能说的是m1已在
IClass2
接口中定义,并由
Class2
实现。编译器将
“abcdef”+c1
转换为
字符串。Concat(object,object)
调用。这将依次对每个参数调用
.ToString()
,并将它们连接起来。以下是reflector的代码:

public static string Concat(object arg0, object arg1)
{
   if(arg0 == null) arg0 = Empty;
   if(arg1 == null) arg1 = Empty;

   return (arg0.ToString() + arg1.ToString());
}

请注意,最后一行涉及调用
string.Concat(string,string)
,真正的连接发生在这里。

这遵循了关于字符串连接的C语言规范的规则。参见C#4规范第7.8.4节(加法运算符)

字符串连接:

string operator +(string x, string y);
string operator +(string x, object y);
string operator +(object x, string y);
二进制
+
运算符的这些重载执行字符串连接。如果字符串串联的操作数为
null
,则替换空字符串。否则,通过调用从类型对象继承的虚拟
ToString
方法,将任何非字符串参数转换为其字符串表示形式。如果
ToString
返回
null
,则替换空字符串

如果您没有预料到会发生这种情况,我可以问一下您对
“abcdef”+c1
表达式的预期结果是什么吗


请注意,
m1
IClass2
Class2
与此处发生的事情无关-只有串联表达式才是真正相关的:这是触发调用
ToString()
,而不管该字符串后来发生了什么。

这是在项目范围内的更改期间发生的。c1最初是字符串。当我更改它的类型时,我预期会出现编译器错误。@afsharm:啊,对了。不,C#一直都是这样的(Java也是如此)。