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

本文关键字:无效 参数 泛型 问题 | 更新日期: 2023-09-27 18:20:25

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:"图像工具.镜像(ref Color32[], int, int("的最佳重载方法匹配有一些无效参数

我做错了什么?

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

看起来您希望 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可以是任何东西。它可以是字符串,int,DateTime,Foo等。编译器无法验证参数是否正确,因此您的代码是非法的。

这将是合法的,但我有一种感觉,对于 3 种所需类型,您的镜像方法有特定的实现,因此它可能不可行。

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

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

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);
    }
}