zma*_*ten 0 c# generics refactoring
我偶然发现两个方法重载完全相同的身体,我想重构它只是一个.
private static bool Compare<T>(T obj1, T obj2, out int test) where T : IComparable<T>
{}
private static bool Compare(IComparable obj1, IComparable obj2, out int test)
{}
Run Code Online (Sandbox Code Playgroud)
签名表示几乎相同的东西,唯一的区别是泛型.有没有办法合并它们?
评论是正确的,到目前为止,这两种方法都不能因为相同IComparable和IComparable<T>不同接口.
但鉴于以下情况,它仍在指示意识到:
private static bool Compare<T>(
T obj1,
T obj2,
out int test) where T : IComparable { }
private static bool Compare(
IComparable obj1,
IComparable obj2,
out int test) { }
Run Code Online (Sandbox Code Playgroud)
如果您将该代码重构为一个单一的重载,那么您将执行重大更改.这两个重载绝对不一样.
在通用的过载,obj1并且obj2必须是相同的编译时间类型(*).在第二个过载,obj1并且obj2可以不同类型的,只要它们实现IComparable.
Compare(1, 1, out test); //resolves to generic
Compare(1, "s", out test); //resolves to non generic
Run Code Online (Sandbox Code Playgroud)
(*)并非严格意义上说,隐式转换在这里发挥作用.