首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >NoWarn在DNX中不起作用

NoWarn在DNX中不起作用
EN

Stack Overflow用户
提问于 2015-06-25 14:17:31
回答 2查看 460关注 0票数 16

在我的测试项目中,我有一些私有字段,这些字段在代码中没有被赋值,但通过反射被赋值。

在编译时,我收到类似这样的警告:

Warning CS0649字段'CLASSNAME.FIELDNAME‘从未被赋值,并且将始终具有其默认值null

但我仍然会遇到错误。

NoWarn在DNX中不工作吗?还是我做错了什么?这个问题有没有其他的解决方案?

EN

回答 2

Stack Overflow用户

发布于 2015-07-07 22:43:07

示例代码:

代码语言:javascript
复制
class Example {
    private string warningHere;    // CS0649
    void UseField() {
        Console.WriteLine(warningHere);
    }
}

你必须让编译器相信你知道你在做什么,它拒绝考虑你使用反射将值插入字段的可能性。这很容易做到:

代码语言:javascript
复制
    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,以提醒他们该功能是否仍然无效。如果你等不及了,一定要考虑挠挠它,自己来解决它。开源项目的最终好处:)

票数 8
EN

Stack Overflow用户

发布于 2015-07-14 20:35:31

不能在xproj文件中指定编译器选项。按照以下步骤取消显示编译器警告:

  1. 打开项目的project.json文件。必须在此文件中指定所有编译器选项。
  2. compilationOptions部分添加到文件的末尾:

"compilationOptions":{ "noWarn":649 }

  • 保存文件并等待几秒钟,直到您在Visual Studio.

  • Rebuild项目的状态栏中看到"Package

  • completed“消息。

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31042602

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档