禁用警告以引起另一个警告的语法(CS1692)

时间:2018-06-23 08:54:24

标签: c# unity3d warnings pragma

我的一个C#类中有以下代码段:

    public override int GetHashCode()
    {
        // Thanks: https://stackoverflow.com/a/5910237

        if (set == null) return 0;

        int h = 0x14345843;

        foreach (T elem in set)
        {
            h = unchecked(h + set.Comparer.GetHashCode(elem));
        }

        return h;
    }

使用此代码,我将收到警告:“'GetHashCode()'中引用的非只读字段”。

正是这种情况下的目的,我添加了以下编译指示以消除该警告:#pragma warning disable RECS0025

但是,在添加了该编译指示后,我仅在Unity编辑器中收到了新的警告-在Visual Studio中构建代码时没有收到

  

警告CS1692:无效的号码

双击将直接带我到#pragma warning disable RECS0025那一行。

我在这里做错了什么?目标是抑制RECS0025警告,当然不会引起其他警告。

其他:我尝试禁用RECS0025编译指示周围的CS1692警告,但这也不起作用。 CS1692错误继续发生。

额外的功能:我在其他地方有一些代码,如下所示:

#pragma warning disable RECS0108
    static SharedPool<Tuple<HierarchyMember, string>, ReactiveProperty<T>> _sharedPool;
#pragma warning restore RECS0108

不会导致CS1692错误发生。也就是说,如果我从#pragma warning disable RECS0025函数周围删除GetHashCode,但保留上面的RECS0108编译指示,则不会发出CS1692警告。

不确定这如何与所提供的两个答案相加。

2 个答案:

答案 0 :(得分:3)

在C#6之前,您不允许在<---指令上使用前缀-假定所有内容都旨在用于C#编译器。

以C#为例:

import java.nio.charset.Charset;

public class Test {
    public static void main(String[] args) {
        byte[] db = new byte[] { -16, -97, -109, -117 };
        String x = new String(db, Charset.forName("utf8"));
        System.out.println(x);
        return;
    }
}

pragma

等效,但是第一个直到C#6才有效。不幸的是,Unity使用了较旧的编译器。否则,无法在源代码中指定#pragma warning CS1692 。选项:

  • 修复错误-大概是通过在构造时计算哈希码并断言set的内容永远都不能更改(它应该是只读set) 无论如何以这种方式使用)
  • 目视忽略错误
  • 找到另一种抑制该警告的方法
  • 禁用发出警告的工具

我会选择第一个。

答案 1 :(得分:3)

这是由于使用非数字前缀。我猜测Unity使用的是旧的编译器,还是未使用C#的最新规范?我一点都不熟悉Unity编译器,但这应该可以解决它。

请注意,这会禁用所有警告,因此我将其范围限制为最大。

public override int GetHashCode()
{
    // Thanks: https://stackoverflow.com/a/5910237
#pragma warning disable
    if (set == null) return 0;

    int h = 0x14345843;

    foreach (T elem in set)
    {
        h = unchecked(h + set.Comparer.GetHashCode(elem));
    }

    return h;
#pragma warning restore
}