C# 对用于调用mscorlib中的ToString()的对象进行不必要的强制转换

C# 对用于调用mscorlib中的ToString()的对象进行不必要的强制转换,c#,object,resharper,virtual,tostring,C#,Object,Resharper,Virtual,Tostring,在StringWriter(mscorlib.dll)中,我找到了一个代码: private StringBuilder _sb; // (...) public override string ToString() { return ((object) this._sb).ToString(); } 我看不出有什么原因(我的R#也是如此,但有时是错的)ToString()是虚拟的,因此施法不会改变行为 这里正在进行什么样的优化 这里正在进行什么样的优化 没有。R#在这里是错的 既不显示

StringWriter
(mscorlib.dll)中,我找到了一个代码:

private StringBuilder _sb;
// (...)
public override string ToString()
{
  return ((object) this._sb).ToString();
} 
我看不出有什么原因(我的R#也是如此,但有时是错的)
ToString()
虚拟的
,因此施法不会改变行为

这里正在进行什么样的优化

这里正在进行什么样的优化

没有。R#在这里是错的

既不显示也不显示这个奇怪的演员阵容,我也没有在电影中找到它

所以代码只是

public override string ToString()
{
    return this._sb.ToString();
}

这没有任何区别,也没有优化。生成的带和不带强制转换的IL完全相同。事实上,当用Reflector打开mscorlib时,它只会说
返回这个

正如您所说,
ToString()
virtual
,并且在
StringWriter
中没有标记为
new
,因此生成的IL在任何情况下都引用
Object.ToString()
(最初声明的方法)(某些基本值类型除外):

即使查看CLI 2.0源代码,代码如下所示:

public override String ToString() {
    return _sb.ToString();
}

根据Reflector,唯一的区别是
StringBuilder.ToString()
不安全。在IL中没有这个关键字,但是可以通过检查不安全的说明来找到它。R可能会认为这是一个差异(虽然不是),更喜欢显式。p> 通过反编译
StringWriter
类,我得到的结果是:
返回这个
public override String ToString() {
    return _sb.ToString();
}