2015-03-03 125 views
3

有没有办法生成编译时间警告的隐式intlong转换? (涉及一个静态分析工具如FxCop的一个答案就可以了。)为Int32生成警告Int64转换为Int64

intlong显然是一个安全的操作,但说我们有一个曾经有过它的标识符和int值库现在升级为使用long所有这些值。

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

一个示例场景将是以下几点:

private void OnProcessGizmoClick() 
{ 
    int gizmoId = 2; 

    // I want the following usage to generate warnings: 
    GizmoFactoryInstance.ProcessGizmo(gizmoId); 
} 

// Library code 
public void ProcessGizmo(long gizmoId); 
+1

@ ParkYoung培这里的主要问题是如何产生的警告。它不会打破它。他知道这一点。他想要的是,如果他的代码中存在隐式演员,他会被提示。 – 2015-03-03 09:09:45

+0

找到'GizmoFactoryInstance.ProcessGizmo'的所有用法,遗留代码必须使用'int'。 – Jodrell 2015-03-03 09:47:43

回答

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); 
+0

我最终编写了自己的FxCop规则(但仍然需要做大量额外的文本搜索和目测),但我只是接受了这个规则。如果我从一开始就使用它,它可能是最安全的选择。 – Ishmaeel 2015-03-31 09:31:28

+0

你能发布这个FxCop规则吗? :-) – Philippe 2015-08-24 14:17:09

5

我认为最好的办法是超载与一个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)] 
+0

当然是一个好方法。不幸的是,图书馆也暴露了财产,而重载对这些都没有帮助。我不得不继续通过重命名属性来打破整个事情。我希望它不必谈到这一点。 – Ishmaeel 2015-03-03 09:20:47