【问题标题】:Removing generic parameter from method signiture从方法签名中删除泛型参数
【发布时间】:2016-06-26 13:06:05
【问题描述】:

我的库中有这样的方法

public void Foo<T>(IQueryable<T> input)
{
    //T is never used and the code compiles when I remove T
} 

我想重构它并删除泛型参数。

public void Foo(IQueryable input) { ... }

它如何影响依赖于我的库的代码? 他们需要重建吗?
他们是否遇到编译错误?
如果他们使用反射来调用这个方法怎么办?

如果我同时创建它们,那么方法解析将始终选择通用的。如何使通用的在以后的版本中被弃用和废弃?

【问题讨论】:

  • 如果您只想将其标记为已过时,请在您的通用方法上使用 [Obsolete] 属性
  • 也许你应该让泛型方法调用非泛型方法?

标签: c# generics backwards-compatibility method-resolution-order


【解决方案1】:

Foo&lt;T&gt;() 在编译后的代码中称为Foo`1。所以它和Foo()不一样,只是在编译后的代码中叫Foo

根据您的问题,您在公共 API 上有此功能,并且您需要向后兼容。如果是我,我会改成这样:

[Obsolete("Call Foo2() instead of the deprecated Foo()", true)]
public void Foo<T>(IQueryable<T> input)
{
    Foo2(input);
}

public void Foo2(IQueryable input)
{
...
}

如果使用旧方法,针对这个新版本编译的任何东西都会报错。这对于内部代码和第 3 方代码都是如此,这就是为什么我会在错误消息中包含下一步要做什么的解释。

【讨论】:

    猜你喜欢
    • 2020-10-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-06
    • 2016-06-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多