Jun*_*kol 5 c# generics backwards-compatibility method-resolution-order
我的库中有这样的方法
public void Foo<T>(IQueryable<T> input)
{
//T is never used and the code compiles when I remove T
}
Run Code Online (Sandbox Code Playgroud)
我想重构它并删除泛型参数.
public void Foo(IQueryable input) { ... }
Run Code Online (Sandbox Code Playgroud)
它如何影响依赖于我的库的代码?他们需要重建吗?
他们遇到编译错误吗?
如果他们使用反射调用此方法怎么办?
如果我创建它们,那么方法解析将始终选择通用的方法.如何在通用版本中使用旧版本并在以后的版本中弃用?
Foo<T>()
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)
{
...
}
Run Code Online (Sandbox Code Playgroud)
如果使用旧方法,针对此新版本编译的任何内容都会抱怨。对于内部代码和第三方代码来说都是如此,这就是为什么我会在错误消息中包含下一步该怎么做的解释。