如何将两个重载重构为一个

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)

签名表示几乎相同的东西,唯一的区别是泛型.有没有办法合并它们?

InB*_*een 5

评论是正确的,到目前为止,这两种方法都不能因为相同IComparableIComparable<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)

(*)并非严格意义上说,隐式转换在这里发挥作用.