我在我的一个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
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 }