C# 诺瓦恩不在DNX工作
在我的测试项目中,我有一些私有字段,这些字段在代码中没有分配给,但是被分配了反射 编译时,我会收到如下警告: 警告CS0649字段“CLASSNAME.FIELDNAME”从未分配给,其默认值始终为空 我已尝试将C# 诺瓦恩不在DNX工作,c#,compiler-warnings,dnx,C#,Compiler Warnings,Dnx,在我的测试项目中,我有一些私有字段,这些字段在代码中没有分配给,但是被分配了反射 编译时,我会收到如下警告: 警告CS0649字段“CLASSNAME.FIELDNAME”从未分配给,其默认值始终为空 我已尝试将649添加到xproj中的第一个PropertyGroup。但我还是会犯错误 NoWarn在DNX中不工作吗?还是我做错了什么?该问题是否有其他解决方案?示例代码: class Example { private string warningHere; // CS0649
649
添加到xproj中的第一个PropertyGroup。但我还是会犯错误
NoWarn在DNX中不工作吗?还是我做错了什么?该问题是否有其他解决方案?示例代码:
class Example {
private string warningHere; // CS0649
void UseField() {
Console.WriteLine(warningHere);
}
}
<>你必须让编译器确信你知道你在做什么,它拒绝考虑使用反射来将一个值戳到字段中的可能性。这很简单:
private string warningHere = null; // Fine
您可能会反对“但这完全没有意义!CLR已经将字段初始化为null!”。这当然是真的。然而,消除像这样的多余代码并没有什么坏处,这是程序员的工作。它特别擅长于删除不必要的空赋值
我可以在csproj中使用
0649
请记住,这相当于用全局大锤解决局部问题。此警告非常重要,您希望它对编译的所有代码都有效。只是为了演示一下,在上面的代码片段中将
class
更改为struct
,使反射代码保持不变。请注意,如果给警告此处字段一个值,则无法获取该值。结构在传递给FieldInfo.SetValue()之前装箱的副作用是,只更新装箱的副本。如果你没有警告提醒你,这是一个很难诊断的错误
在源代码中使用#pragma warning
是一种很好的方法,但并不优越,很容易忘记恢复它
两个月前,项目切换到了使用MSBuild的building,请确保您的拉法不会太旧,并且您也切换了。您可以在github上提交一个bug,以提醒他们该功能是否仍然处于非法状态。如果你迫不及待,就要考虑搔痒。开源项目的最终好处是:)不能在xproj文件中指定编译器选项。按照以下步骤抑制编译器警告:
打开项目的project.json
文件。必须在此文件中指定所有编译器选项
将节添加到文件末尾:
“编译选项”:{
“诺瓦恩”:[649]
}
保存该文件并等待几秒钟,直到在Visual Studio的状态栏中看到“Package Restore completed”消息
重建项目
这将抑制警告。然而,有时(可能是一个bug),您对project.json
所做的更改即使在干净的构建之后也不会生效。在这种情况下,通过对文件进行额外的虚拟更改和重建通常可以解决问题 嗯,更大的问题不是警告——而是警告的含义。如果这个字段从未被使用过并且是私有的,未来的编译器完全可以删除它。没有比隐藏完全合理的警告更好的编写代码的方法了吗?字段被使用了,只是没有分配给。如果编译器删除这些,那就太疯狂了。此外,Fakeitesy中的InitializeTexture依赖于具有未指定的字段。当问我是否做错了什么时,我说的是我如何尝试禁用警告。不是代码的编写方式。但就编译器而言,它们总是null
,因此所有从字段读取的内容都可以替换为null
。在任何情况下,如果你想坚持这种用法,我总是使用#pragma
来禁用警告-你可能想试试。是的,#pragma warning disable 0649
有效。但是,我不想在我的测试类中包含这些警告,而是希望能够禁用整个测试项目的警告。对于旧项目,我可以在csproj中使用0649
。我在xproj中寻找类似的东西。我在下面扩展了答案,解释了为什么这是个坏主意。我知道它的缺点。我对为什么这是件坏事的讲座不感兴趣。如果我想的话,我会带着剪刀跑……:)嗯,那是我不想去的地方。如果你不想自己修复它,那么就在项目中提交一个bug报告。“注意,不管你怎么做,你都不能给warningHere字段一个值。”正如你所说的,结构将被装箱,然后你可以在装箱的值上设置字段,稍后再取消装箱。这是完全可行的。不是很有用,但可行。我确实认为“我如何忽略特定的警告”是一个合理的问题。这会很好,但我无法让它发挥作用。我在地图上找不到它的踪迹。@Allrameet是的,你在那里找不到它。然而,我只是尝试了一下,它确实有效。尝试以任何方式更改project.json
(抑制另一个警告),然后按照步骤进行操作。尝试后无效。并且发现如果代码库中没有任何支持它的选项,很难看到它是如何工作的…@Allrameest注意到CompilerOptions
并没有指明哪些选项受支持,哪些选项不受支持。它仅用于引用部分代码中的编译器选项。同样如我所说,对project.json
所做的更改在您构建时可能会生效,也可能不会生效。解决这个问题的最好方法是执行一个干净的构建并多次更改文件。