我的一个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
警告。
不确定这如何与所提供的两个答案相加。
答案 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
。选项:
我会选择第一个。
答案 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
}