簡體   English   中英

生成Int32到Int64強制轉換的警告

[英]Generating warnings for Int32 to Int64 casts

有沒有辦法為隱式intlong轉換生成編譯時警告? (答案涉及靜態分析工具,如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)]

使用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);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM