在我的测试项目中,我有一些私有字段,这些字段在代码中没有被赋值,但通过反射被赋值。
在编译时,我收到类似这样的警告:
Warning CS0649字段'CLASSNAME.FIELDNAME‘从未被赋值,并且将始终具有其默认值null
但我仍然会遇到错误。
NoWarn在DNX中不工作吗?还是我做错了什么?这个问题有没有其他的解决方案?
发布于 2015-07-07 22:43:07
示例代码:
class Example {
private string warningHere; // CS0649
void UseField() {
Console.WriteLine(warningHere);
}
}
你必须让编译器相信你知道你在做什么,它拒绝考虑你使用反射将值插入字段的可能性。这很容易做到:
private string warningHere = null; // Fine
您可能会反对“但这完全没有意义!CLR已经将该字段初始化为null!”。这当然是真的。然而,消除这种多余的代码并没有什么坏处,这是jitter optimizer的工作。它特别擅长删除不必要的空赋值。
I可以在csproj中使用
<NoWarn>0649</NoWarn>
一定要记住,这相当于用全局大锤解决局部问题。这个警告非常重要,你想让它对你编译的所有代码生效。为了演示一下,在上面的代码片段中,将class
更改为struct
,保持反射代码不变。请注意,您不能为warningHere
字段赋值。在将结构传递给FieldInfo.SetValue()之前对其进行装箱的副作用,只有装箱的副本才会更新。如果没有警告来提醒您,这将是一个很难诊断的错误。
在源代码中使用#pragma warning
是可以的,但并不优越,太容易忘记恢复它。
该项目在两个月前才切换到使用MSBuild构建,请确保您的pull不是太老,并且您也切换了。你可以在github上提交一个bug,以提醒他们该功能是否仍然无效。如果你等不及了,一定要考虑挠挠它,自己来解决它。开源项目的最终好处:)
发布于 2015-07-14 20:35:31
不能在xproj文件中指定编译器选项。按照以下步骤取消显示编译器警告:
project.json
文件。必须在此文件中指定所有编译器选项。"compilationOptions":{ "noWarn":649 }
这应该会抑制该警告。但是,有时(可能是一个bug),即使在干净的构建之后,您对project.json
所做的更改也不会生效。在这种情况下,通过对文件进行额外的虚拟更改和重建通常可以解决问题。
https://stackoverflow.com/questions/31042602
复制相似问题