当前位置 : 主页 > 编程语言 > c语言 >

c# – 禁用警告导致另一个警告的Pragma(CS1692)

来源:互联网 收集:自由互联 发布时间:2021-06-25
我在我的一个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.Ge
我在我的一个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.

但是,在添加该pragma之后,我仅在Unity编辑器中收到了一个新警告 – 而不是在Visual Studio中构建代码时:

warning CS1692: Invalid number

双击它会直接指向#pragma警告禁用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编译指示,则不会出现CS1692警告.

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

这是由于非数字前缀.我猜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
}
网友评论