为 Int32 到 Int64 转换生成警告
Generating warnings for Int32 to Int64 casts
有没有办法为隐式 int
到 long
转换生成编译时警告? (涉及 FxCop 等静态分析工具的答案就可以了。)
将 int
转换为 long
显然是一个安全的操作,但是假设我们有一个库,它的标识符曾经有 int
值,现在升级为对所有这些都使用 long
值。
现在,客户端代码需要进行相应的更新。因为如果客户端向期望 Int64
的方法提供 Int32
参数 - 很可能需要更新客户端代码。
示例场景如下:
private void OnProcessGizmoClick()
{
int gizmoId = 2;
// I want the following usage to generate warnings:
GizmoFactoryInstance.ProcessGizmo(gizmoId);
}
// Library code
public void ProcessGizmo(long gizmoId);
我认为最好的方法是使用 Int32 参数输入重载该方法,这在内部只能执行转换为 Int64 - 但您的重载方法可能被标记为已弃用。
[Obsolete("Please use an Int64 for your identifier instead")]
然后 Visual Studio 将看到两个版本,并使用 Int32 声明,这会给出已弃用的警告。
如果在以后的版本中,或者对于您绝对不想使用 Int32 参数调用的某些方法,您决定要导致编译器错误,您也可以将其更新为以下内容.
[Obsolete("Please use an Int64 for your identifier instead", true)]
通过 long
和 int
的隐式转换定义您自己的类型;对 int
的隐式转换发出警告,例如:
public struct GizmoInteger
{
private long m_Value;
private GizmoInteger(long value)
{
m_Value = value;
}
[Obsolete("Use long instead")]
public static implicit operator GizmoInteger(int value)
{
return new GizmoInteger(value);
}
public static implicit operator GizmoInteger(long value)
{
return new GizmoInteger(value);
}
}
void Foo(GizmoInteger i)
{
}
// warning
Foo(4);
// OK
Foo(4L);
有没有办法为隐式 int
到 long
转换生成编译时警告? (涉及 FxCop 等静态分析工具的答案就可以了。)
将 int
转换为 long
显然是一个安全的操作,但是假设我们有一个库,它的标识符曾经有 int
值,现在升级为对所有这些都使用 long
值。
现在,客户端代码需要进行相应的更新。因为如果客户端向期望 Int64
的方法提供 Int32
参数 - 很可能需要更新客户端代码。
示例场景如下:
private void OnProcessGizmoClick()
{
int gizmoId = 2;
// I want the following usage to generate warnings:
GizmoFactoryInstance.ProcessGizmo(gizmoId);
}
// Library code
public void ProcessGizmo(long gizmoId);
我认为最好的方法是使用 Int32 参数输入重载该方法,这在内部只能执行转换为 Int64 - 但您的重载方法可能被标记为已弃用。
[Obsolete("Please use an Int64 for your identifier instead")]
然后 Visual Studio 将看到两个版本,并使用 Int32 声明,这会给出已弃用的警告。
如果在以后的版本中,或者对于您绝对不想使用 Int32 参数调用的某些方法,您决定要导致编译器错误,您也可以将其更新为以下内容.
[Obsolete("Please use an Int64 for your identifier instead", true)]
通过 long
和 int
的隐式转换定义您自己的类型;对 int
的隐式转换发出警告,例如:
public struct GizmoInteger
{
private long m_Value;
private GizmoInteger(long value)
{
m_Value = value;
}
[Obsolete("Use long instead")]
public static implicit operator GizmoInteger(int value)
{
return new GizmoInteger(value);
}
public static implicit operator GizmoInteger(long value)
{
return new GizmoInteger(value);
}
}
void Foo(GizmoInteger i)
{
}
// warning
Foo(4);
// OK
Foo(4L);