用于禁用导致另一个警告的警告的 Pragma (CS1692)

Pragma to disable warning causing another warning (CS1692)

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

    public override int GetHashCode()
    {
        // Thanks: 

        if (set == null) return 0;

        int h = 0x14345843;

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

        return h;
    }

使用此代码,我会收到警告:"Non-readonly field referenced in 'GetHashCode()'"。

在这种情况下,我添加了以下 pragma 以消除该警告:#pragma warning disable RECS0025.

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

warning CS1692: Invalid number

双击它会直接转到 #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 错误。也就是说,如果我从 GetHashCode 函数周围删除 #pragma warning disable RECS0025,但保留上面的 RECS0108 pragma,将不会有 CS1692 警告。

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

在 C# 6 之前,您不能在 pragma 指令上使用前缀 - 假定所有内容都是为 C# 编译器设计的。

以您的 C# 为例:

#pragma warning CS1692

#pragma warning 1692

是等价的,但第一个在 C# 6 之前是无效的。不幸的是,Unity 使用了较旧的编译器。没有它就无法在源代码中指定 RECS0025 。选项:

  • 修复错误 - 大概是通过在构造时计算哈希码并断言集合内容永远不会改变(它应该是一个只读集合 反正要这样用)
  • 视觉上忽略错误
  • 寻找另一种方法来抑制该警告
  • 禁用引发警告的工具

我会选择第一个。

这是因为非数字前缀。我猜 Unity 使用的是旧编译器还是不是最新的 C# 规范?我根本不熟悉 Unity 编译器,但这应该可以解决它。

请注意,这会禁用所有警告,因此我会尽可能地限制它的范围。

public override int GetHashCode()
{
    // Thanks: 
#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
}