在我的测试项目中,我有一些未在代码中分配的私有字段,而是通过反射分配的。
编译时我收到如下警告:
警告 CS0649 字段“CLASSNAME.FIELDNAME”从未分配给,并且始终具有其默认值 null
我尝试添加<NoWarn>649</NoWarn>
到 xproj 中的第一个 PropertyGroup。但我仍然得到错误。
NoWarn 在 DNX 中不起作用吗?还是我做错了什么?有没有其他解决方案?
在我的测试项目中,我有一些未在代码中分配的私有字段,而是通过反射分配的。
编译时我收到如下警告:
警告 CS0649 字段“CLASSNAME.FIELDNAME”从未分配给,并且始终具有其默认值 null
我尝试添加<NoWarn>649</NoWarn>
到 xproj 中的第一个 PropertyGroup。但我仍然得到错误。
NoWarn 在 DNX 中不起作用吗?还是我做错了什么?有没有其他解决方案?
示例代码:
class Example {
private string warningHere; // CS0649
void UseField() {
Console.WriteLine(warningHere);
}
}
您必须说服编译器您知道自己在做什么,它拒绝考虑您使用反射将值插入字段的可能性。这很简单:
private string warningHere = null; // Fine
您可能会反对“但这完全没有意义!CLR 已经将该字段初始化为空!”。这当然是真的。然而,没有什么坏处,消除像这样的多余代码是抖动优化器的工作。它特别擅长删除不必要的空分配。
我可以
<NoWarn>0649</NoWarn>
在 csproj
请记住,这相当于用全球大锤解决局部问题。这个警告非常重要,您希望它对您编译的所有代码都有效。只是为了演示,在上面的代码片段中更改class
为struct
,保持反射代码相同。请注意,您无法为该warningHere
字段赋值。结构在传递给 FieldInfo.SetValue() 之前被装箱的副作用,只有装箱的副本被更新。如果您没有警告来提醒您,那将是一个令人讨厌的错误诊断。
在源中使用#pragma warning
还可以,但并不优越,太容易忘记恢复它。
该项目仅在两个月前切换到使用 MSBuild 构建,请确保您的 pull 不是太旧并且您也切换了。您可以在 github 上提交错误,以提醒他们该功能是否仍然存在。如果你等不及,请考虑抓挠痒,自己修复。开源项目的最终好处:)
无法在 xproj 文件中指定编译器选项。请按照以下步骤禁止编译器警告:
打开project.json
项目的文件。必须在此文件中指定所有编译器选项。
将compilationOptions部分添加到文件末尾:
“编译选项”:{“noWarn”:[649] }
保存文件并等待几秒钟,直到您在 Visual Studio 的状态栏中看到“包还原已完成”消息。
重建项目。
这应该抑制警告。但是,有时(可能是一个错误),即使在干净的构建之后,您所做的更改project.json
也不会生效。在这种情况下,通过对文件进行额外的虚拟更改并重建通常可以解决问题。