首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Automatic .ToString()?

Automatic .ToString()?
EN

Stack Overflow用户
提问于 2010-09-21 18:21:35
回答 2查看 3.3K关注 0票数 3

我有一个这样的方法:void m1(string str),还有一个这样的类:

代码语言:javascript
复制
public class MyClass
{
    public bool b1 { set; get; }

    //and other properties
}

现在,为什么下面的代码不会导致编译错误?

代码语言:javascript
复制
IClass2 _class2 = new Class2();
MyClass c1 = new MyClass();
_class2.m1("abcdef" + c1);

当我调试它时,我意识到c1.ToString()已经被传递给了m1。为什么会发生这种自动.ToString()?我唯一能说的是,m1已经在IClass2接口中定义,并且已经由Class2实现。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 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表达式的预期结果是什么?

请注意,m1IClass2Class2与这里发生的事情无关-只有连接表达式才是真正相关的:这是触发对ToString()的调用的原因,而不管该字符串后来发生了什么。

票数 9
EN

Stack Overflow用户

发布于 2010-09-21 18:23:59

编译器将"abcdef" + c1转换为string.Concat(object,object)调用。这反过来将对每个参数调用.ToString(),并将它们连接起来。下面是来自反射器的代码:

代码语言:javascript
复制
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)的调用,真正的串联发生在这里。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3759343

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档