在我的测试项目中,我有一些私有(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上提交错误,以提醒他们该功能是否仍然有效。如果您迫不及待,请考虑挠痒痒,自行修复。开源项目的最终好处:)