【问题标题】:Pragma to disable warning causing another warning (CS1692)Pragma 禁用导致另一个警告的警告 (CS1692)
【发布时间】:2018-06-23 08:54:24
【问题描述】:

我的一个 C# 类中有以下 sn-p 代码:

    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 pragma 周围的 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# unity3d warnings pragma


    【解决方案1】:

    这是由于非数字前缀。我猜 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
    }
    

    【讨论】:

    • 谢谢 :) 我最终选择了这个解决方案。为了最小化范围,我实例化了一个新变量 var s = set;(并在其他地方使用了它而不是 set),并且仅针对该声明行禁用了警告。
    【解决方案2】:

    在 C# 6 之前,您不能在 pragma 指令上使用前缀 - 一切都被假定为用于 C# 编译器。

    以你的 C# 为例:

    #pragma warning CS1692
    

    #pragma warning 1692
    

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

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

    我会选择第一个。

    【讨论】:

    • 您好,感谢您的回答。这是有道理的,但我在我的答案中添加了一个 extra extra ......这并没有加起来。你怎么看?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-20
    • 2011-12-28
    • 1970-01-01
    • 1970-01-01
    • 2018-07-02
    • 1970-01-01
    相关资源
    最近更新 更多