用于禁用导致另一个警告的警告的 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
}
我的一个 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
}