Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/330.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为Int32到Int64强制转换生成警告_C#_Casting_Compiler Warnings_Static Analysis - Fatal编程技术网

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规则吗?:-)