C# 诺瓦恩不在DNX工作

C# 诺瓦恩不在DNX工作,c#,compiler-warnings,dnx,C#,Compiler Warnings,Dnx,在我的测试项目中,我有一些私有字段,这些字段在代码中没有分配给,但是被分配了反射 编译时,我会收到如下警告: 警告CS0649字段“CLASSNAME.FIELDNAME”从未分配给,其默认值始终为空 我已尝试将649添加到xproj中的第一个PropertyGroup。但我还是会犯错误 NoWarn在DNX中不工作吗?还是我做错了什么?该问题是否有其他解决方案?示例代码: class Example { private string warningHere; // CS0649

在我的测试项目中,我有一些私有字段,这些字段在代码中没有分配给,但是被分配了反射

编译时,我会收到如下警告:

警告CS0649字段“CLASSNAME.FIELDNAME”从未分配给,其默认值始终为空

我已尝试将
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
    所做的更改在您构建时可能会生效,也可能不会生效。解决这个问题的最好方法是执行一个干净的构建并多次更改文件。