通用函数重载

时间:2014-02-18 21:07:48

标签: c# generics overloading

我有以下问题:

有几种带有基色接口IColor的颜色接口。

public interface IColor { }
public interface IColor3 : IColor { }
public interface IColor4 : IColor { }

某些算法仅支持对某些颜色类型进行处理:

    public static Image<TColor, byte> Bla<TColor>(this Image<TColor, byte> img, bool inPlace = true)
        where TColor : IColor4
    {
       //do something
    }

    public static Image<TColor, byte> Bla<TColor>(this Image<TColor, byte> img, bool inPlace = true)
        where TColor : IColor3
    {
       //do something
    }

当我尝试编译时,我得到一个错误,即已经定义了具有相同参数的函数。 我该如何解决这个问题?

3 个答案:

答案 0 :(得分:7)

方法的重载仅基于参数和名称。这意味着你编写一个复制方法而不是重载。

我建议您编辑此代码:

public static Image<IColor4, byte> Bla(this Image<IColor4, byte> img, bool inPlace = true)
{
   //do something
}

public static Image<IColor3, byte> Bla(this Image<IColor3, byte> img, bool inPlace = true)
{
   //do something
}

或者:

public static Image<TColor, byte> Bla<TColor>(this Image<TColor, byte> img, bool inPlace = true)
    where TColor : IColor
{
    if(TColor == typeof(SomeSpecificType))
    {
        // do something specific here.
    }
}

答案 1 :(得分:1)

为了完成这项工作,您需要两个不同的(但可能类似的)通用类

public static Image4<TColor, byte> Bla<TColor>(this Image<TColor, byte> img, bool inPlace = true)
    where TColor : IColor4
{
   //do something
}

public static Image3<TColor, byte> Bla<TColor>(this Image<TColor, byte> img, bool inPlace = true)
    where TColor : IColor3
{
   //do something
}

还取决于你想要什么。这两个类可以从一个公共基础继承,该基础执行可以在类型IColor上执行的任何常用功能

答案 2 :(得分:0)

如评论中所述,您提供的示例实际上并不构成方法重载,因为方法重载基于方法签名,该签名仅包含参数。

您可以使用一种方法并测试从

中的IColor派生的接口
public static Image<TColor, byte> Bla<TColor>(this Image<TColor, byte> img, bool inPlace = true)
    where TColor : IColor
{
    if (img is IColor3)
    {
        //do something
    }
    if (img is IColor4)
    {
        //do something
    }
}