我有一个这样的方法:void m1(string str),还有一个这样的类:
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实现。
发布于 2010-09-21 18:25:05
这遵循C#语言规范中关于字符串连接的规则。参见C# 4规范的7.8.4节(加法运算符)
字符串连接:
字符串运算符+(字符串x,字符串y);字符串运算符+(字符串x,对象y);字符串运算符+(对象x,字符串y);
二进制+运算符的这些重载执行字符串连接。如果字符串连接的操作数为null,则替换为空字符串。否则,通过调用从类型object继承的虚拟ToString方法,将任何非字符串参数转换为其字符串表示形式。如果ToString返回null,则替换为空字符串。
如果您没有预料到会发生这种情况,我想问一下您对"abcdef" + c1表达式的预期结果是什么?
请注意,m1、IClass2和Class2与这里发生的事情无关-只有连接表达式才是真正相关的:这是触发对ToString()的调用的原因,而不管该字符串后来发生了什么。
发布于 2010-09-21 18:23:59
编译器将"abcdef" + c1转换为string.Concat(object,object)调用。这反过来将对每个参数调用.ToString(),并将它们连接起来。下面是来自反射器的代码:
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)的调用,真正的串联发生在这里。
https://stackoverflow.com/questions/3759343
复制相似问题