16

在我的测试项目中,我有一些未在代码中分配的私有字段,而是通过反射分配的。

编译时我收到如下警告:

警告 CS0649 字段“CLASSNAME.FIELDNAME”从未分配给,并且始终具有其默认值 null

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

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

4

2 回答 2

8

示例代码:

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

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

    private string warningHere = null;  // Fine

您可能会反对“但这完全没有意义!CLR 已经将该字段初始化为空!”。这当然是真的。然而,没有什么坏处,消除像这样的多余代码是抖动优化器的工作。它特别擅长删除不必要的空分配。


我可以<NoWarn>0649</NoWarn>在 csproj

请记住,这相当于用全球大锤解决局部问题。这个警告非常重要,您希望它对您编译的所有代码都有效。只是为了演示,在上面的代码片段中更改classstruct,保持反射代码相同。请注意,您无法为该warningHere字段赋值。结构在传递给 FieldInfo.SetValue() 之前被装箱的副作用,只有装箱的副本被更新。如果您没有警告来提醒您,那将是一个令人讨厌的错误诊断。

在源中使用#pragma warning还可以,但并不优越,太容易忘记恢复它。

该项目仅在两个月前切换到使用 MSBuild 构建,请确保您的 pull 不是太旧并且您也切换了。您可以在 github 上提交错误,以提醒他们该功能是否仍然存在。如果你等不及,请考虑抓挠痒,自己修复。开源项目的最终好处:)

于 2015-07-07T14:43:06.803 回答
0

无法在 xproj 文件中指定编译器选项。请按照以下步骤禁止编译器警告:

  1. 打开project.json项目的文件。必须在此文件中指定所有编译器选项。

  2. compilationOptions部分添加到文件末尾:

    “编译选项”:{“noWarn”:[649] }

  3. 保存文件并等待几秒钟,直到您在 Visual Studio 的状态栏中看到“包还原已完成”消息。

  4. 重建项目。

这应该抑制警告。但是,有时(可能是一个错误),即使在干净的构建之后,您所做的更改project.json也不会生效。在这种情况下,通过对文件进行额外的虚拟更改并重建通常可以解决问题。

于 2015-07-14T12:35:30.673 回答