生成Int32到Int64强制转换的警告

时间:2015-03-03 08:44:07

标签: c# casting compiler-warnings static-analysis

有没有办法为隐式intlong次转化生成编译时警告? (答案涉及静态分析工具,如FxCop会没问题。)

int投射到long显然是一种安全的操作,但我们说我们有一个库,它的标识符曾经有int个值,现在已升级为使用{ {1}}所有值的值。

现在,客户端代码需要相应更新。因为如果客户端向期望long的方法提供Int32参数,则很可能需要更新客户端代码。

示例场景如下:

Int64

2 个答案:

答案 0 :(得分:5)

我认为最好的方法是使用Int32参数输入重载该方法,该输入在内部只能执行强制转换为Int64 - 但您的重载方法可能被标记为已弃用。

[Obsolete("Please use an Int64 for your identifier instead")]

然后Visual Studio将看到这两个版本,并使用Int32声明,该声明会给出不推荐的警告。

如果在以后的版本中,或者对于您绝对不希望使用Int32参数调用的某些方法,您决定要导致编译器错误,您还可以将其更新为以下内容。 / p>

[Obsolete("Please use an Int64 for your identifier instead", true)]

答案 1 :(得分:3)

使用longint的隐式转换定义您自己的类型;对来自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);