C# 为Int32到Int64强制转换生成警告
有没有办法为隐式C# 为Int32到Int64强制转换生成警告,c#,casting,compiler-warnings,static-analysis,C#,Casting,Compiler Warnings,Static Analysis,有没有办法为隐式int到long转换生成编译时警告?(一个包含静态分析工具(如FxCop)的答案就可以了。) 将int转换为long显然是一种安全的操作,但假设我们有一个库,它的标识符过去有int值,现在升级为对所有标识符使用long值 现在,需要相应地更新客户机代码。因为如果客户机向一个需要Int64的方法提供Int32参数,则很可能需要更新客户机代码 示例场景如下所示: private void OnProcessGizmoClick() { int gizmoId = 2;
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")]
然后VisualStudio将看到这两个版本,并使用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);
@这里主要关注的是如何生成警告。它不会打破它。他知道这一点。他想要的是,如果代码中存在隐式强制转换,则会提示他。如果要查找
GizmoFactoryInstance.ProcessGizmo
的所有用法,则旧代码必须使用int
。这当然是一个很好的方法。不幸的是,库还公开了属性,重载对这些属性没有帮助。我必须通过重新命名属性来打破这一切。我希望事情不会变成这样。我最终编写了自己的FxCop规则(还需要做很多额外的文本搜索和目测),但我刚刚接受了这个规则。如果我从一开始就使用它,这可能是最安全的选择。你能发布这个FxCop规则吗?:-)