C# &引用;“无法对儿童进行评估”;检查重写的ToString()时
调试时,我试图检查C# &引用;“无法对儿童进行评估”;检查重写的ToString()时,c#,visual-studio,unity3d,C#,Visual Studio,Unity3d,调试时,我试图检查列表的值,但是如果T覆盖ToString(),则会出现“无法计算子项”错误。我正在使用VS2017并调试Unity3D 5.6.0f项目 示例代码: void Start () { //if Sphere.ToString() is commented out, the contents are displayed correctly var obstacles = parser.ParseFile(Variables.Paths.DefaultScene).ToL
列表的值,但是如果T
覆盖ToString()
,则会出现“无法计算子项”错误。我正在使用VS2017并调试Unity3D 5.6.0f项目
示例代码:
void Start () {
//if Sphere.ToString() is commented out, the contents are displayed correctly
var obstacles = parser.ParseFile(Variables.Paths.DefaultScene).ToList();
}
//...
[System.Diagnostics.DebuggerDisplay("{ToString()}")]//with or without this attribute
public class Sphere
{
public Vector3 Center { get; set; }
public float Radius { get; set; }
public override string ToString()
{
return "[r: " + Radius + " c: " + Center + "]";
}
}
无论T
是class还是struct似乎都没有任何效果,DebuggerDisplay
属性同样没有效果-无论如何都无法检查列表。
var tmp = new Sphere();
但是,正确显示tmp
的ToString()
。如何解决此问题?快速查看文档表明,您应该使用自定义ToString()
或DebuggerDisplay
属性。不是两者都有。特别是如果DebuggerDisplay只是一个{ToString()}
调用
以下是提到此问题的文档段落:
如果类具有重写的ToString()方法,则调试器将使用
重写的方法,而不是默认的{}。因此,如果你
如果重写了ToString()方法,调试器将使用
重写方法而不是默认的{},并且您不需要
必须使用DebuggerDisplay。如果两者都使用,则调试程序将显示
属性优先于重写的ToString()方法
来源:如问题中所述,是否有DebuggerDisplay
对任何情况都没有影响。尝试检查列表时始终会生成“无法计算子项”。您是否尝试删除ToString()并将其添加到标题中<代码>[System.Diagnostics.DebuggerDisplay(“[r:{Radius}c:{Center}]”)
您找到问题的解决方案了吗?我从System.Dynamic.DynamicObject派生的类也遇到了类似的问题。DebuggerDisplay按预期工作。但是我在watch视图中扩展实例的子对象时出现错误“Children cannot be evaluation”,这会使调试器崩溃(调试停止)。我猜这可能和你的原因一样。(虽然我没有使用统一,所以我认为你的问题也与统一无关)。@sboisse不,遗憾的是没有。Unity中的调试仍然存在问题(尽管在以后的版本中似乎没有那么严重)。IEnumerable不可用,其他非数组集合偶尔工作。通过在必要时打印到控制台来学习如何使用它。很确定问题来自统一,更确切地说是它所使用的单后端-还有其他理论吗?不幸的是,我没有统一的经验。然而,当我意识到在自定义DynamicObject的一个重写方法中有一个意外的递归调用时,我修复了我的问题。因此,当VS2017试图在监视面板中显示我的动态对象的内容时,可能是堆栈溢出导致崩溃。在修复递归之后,一切都按预期工作。因此,如果您的问题只发生在您自己的一个自定义实现上,而不是发生在其他实现上,那么可能与我的问题类似。