C#泛型问题:一些无效的参数

时间:2012-01-17 04:03:24

标签: c# generics arguments

public class ImgBuffer<T>
{
    public T[] buf;
    public int width;
    public int height;
    public ImgBuffer () {}
    public ImgBuffer (int w, int h)
    {
        buf = new T[w*h];
        width = w;
        height = h;
    }

    public void Mirror()
    {
        ImageTools.Mirror (ref buf, width, height);
    }
}

ImageTools类在第一个参数上为byte [],short []和Color32 []定义了Mirror。特别是:

public void Mirror(ref Color32[] buf, int width, int height) { ....

但是我收到了这个错误:

错误CS1502:`ImageTools.Mirror(ref Color32 [],int,int)'的最佳重载方法匹配有一些无效的参数

我做错了什么?

2 个答案:

答案 0 :(得分:4)

看起来您希望C#泛型类似于模板。事实并非如此。根据您的描述,似乎有一个类似于

的ImageTools类
public class ImageTools
{
    public static void Mirror(ref byte[] buf, int width, int height) { }
    public static void Mirror(ref Color32[] buf, int width, int height) { }
    public static void Mirror(ref short[] buf, int width, int height) { }
}

你有一个看起来像这个(缩写)的ImgBuffer类

public class ImgBuffer<T>
{
    public T[] buf;
    public int width;
    public int height;

    public void Mirror()
    {
        ImageTools.Mirror(ref buf, width, height);
    }
}

编译器无法在ImgBuffer.Mirror中验证对ImageTools.Mirror的调用是否合法。所有编译器都知道ref buf的类型是T[]T可以是任何东西。它可能是string,int,DateTime,Foo等。编译器无法验证参数是否正确,因此您的代码是非法的。

这个是合法的,但我觉得你有3个所需类型的Mirror方法的具体实现,所以它可能不可行。

public class ImageTools<T>
{
    public static void Mirror(ref T[] buf, int width, int height) { }
}

答案 1 :(得分:0)

您需要确定泛型类型参数的范围。例如:

public class ImgBuffer<T> where T : Color32
{
    public T[] buf;
    public int width;
    public int height;
    public ImgBuffer () {}
    public ImgBuffer (int w, int h)
    {
        buf = new T[w*h];
        width = w;
        height = h;
    }

    public void Mirror()
    {
        ImageTools.Mirror (ref buf, width, height);
    }
}