在我的测试项目中,我有一些私有(private)字段,这些私有(private)字段在代码中没有分配,但是分配了反射。

编译时收到如下警告:



我尝试将<NoWarn>649</NoWarn>添加到xproj中的第一个PropertyGroup中。但是我仍然得到错误。

NoWarn在DNX中不起作用吗?还是我做错了什么?还有其他解决方案吗?

最佳答案

样例代码:

class Example {
    private string warningHere;    // CS0649
    void UseField() {
        Console.WriteLine(warningHere);
    }
}

您必须说服编译器您知道自己在做什么,但它拒绝考虑使用反射将值插入字段的可能性。这很简单:
    private string warningHere = null;  // Fine

您可能会反对“但这是完全没有意义的!CLR已将该字段初始化为null!”。确实是这样。但是,这样做并没有什么坏处,因此jitter optimizer的工作就是消除多余的代码。在删除不必要的空分配方面特别擅长。



请记住,这等效于使用全局大锤解决局部问题。该警告非常重要,您希望对所有编译的代码都有效。只是为了演示,在上面的代码片段中将class更改为struct,保持反射代码不变。并请注意,您无法给warningHere字段一个值。在将结构装箱之前,将其传递给FieldInfo.SetValue()的副作用是,仅对装箱的副本进行更新。这是一个令人讨厌的错误,可以诊断您是否没有警告来提醒您。

在源代码中使用#pragma warning可以,但不是高级的,太容易忘记恢复它。

该项目仅在两个月前才转而使用MSBuild进行构建,请确保您的拉力不太旧并且也进行了切换。您可以在github上提交错误,以提醒他们该功能是否仍然有效。如果您迫不及待,请考虑挠痒痒,自行修复。开源项目的最终好处:)

10-05 19:21