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

C#泛型问题:一些无效参数,c#,generics,arguments,C#,Generics,Arguments,但我得到了这个错误: 错误CS1502:与“ImageTools.Mirror(ref Color32[],int,int)”匹配的最佳重载方法具有一些无效参数 我做错了什么?看起来你希望C#泛型类似于模板。事实并非如此。根据您的描述,似乎有一个ImageTools类类似于 public void Mirror(ref Color32[] buf, int width, int height) { .... 您有一个ImgBuffer类,看起来像这样(缩写) 看起来你希望C#泛型类似于模板。事

但我得到了这个错误:

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

我做错了什么?

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

public void Mirror(ref Color32[] buf, int width, int height) { ....
您有一个ImgBuffer类,看起来像这样(缩写)

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

public void Mirror(ref Color32[] buf, int width, int height) { ....
您有一个ImgBuffer类,看起来像这样(缩写)


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

public class ImageTools<T>
{
    public static void Mirror(ref T[] buf, int width, int height) { }
}
公共类ImgBuffer,其中T:Color32
{
公共T[]buf;
公共整数宽度;
公众内部高度;
公共ImgBuffer(){}
公共ImgBuffer(int w,int h)
{
buf=新的T[w*h];
宽度=w;
高度=h;
}
公共空间镜像()
{
镜像工具(参考buf、宽度、高度);
}
}

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

public class ImageTools<T>
{
    public static void Mirror(ref T[] buf, int width, int height) { }
}
公共类ImgBuffer,其中T:Color32
{
公共T[]buf;
公共整数宽度;
公众内部高度;
公共ImgBuffer(){}
公共ImgBuffer(int w,int h)
{
buf=新的T[w*h];
宽度=w;
高度=h;
}
公共空间镜像()
{
镜像工具(参考buf、宽度、高度);
}
}


ImageTools是否在
字符串[]上有镜像重载
?因为我完全想做一个
ImgBuffer
。接下来我将使用一个
ImgBuffer
。那么编译器如何知道使用字符串数组调用镜像是合法的呢?这是一个笑话吗?我使用的是字符串数组吗?Color32是一个4字节的结构(红色、绿色、蓝色、alpha)。我需要各种图像(像素)格式,具有类似的功能。不,这实际上不是一个玩笑。编译器不知道t将只按字节、短字符或颜色32显示。就编译器而言,T可以是字符串DateTime。这些调用是不合法的,因此您会收到错误消息。ImageTools是否在
string[]
上有镜像重载?因为我完全想做一个
ImgBuffer
。接下来我将使用一个
ImgBuffer
。那么编译器如何知道使用字符串数组调用镜像是合法的呢?这是一个笑话吗?我使用的是字符串数组吗?Color32是一个4字节的结构(红色、绿色、蓝色、alpha)。我需要各种图像(像素)格式,具有类似的功能。不,这实际上不是一个玩笑。编译器不知道t将只按字节、短字符或颜色32显示。就编译器而言,T可以是字符串DateTime。这些电话是不合法的,因此你会收到错误信息。我明白了。是的,这是我第一次进入C泛型,我以前是C++模板的家伙。非常感谢。那么,有没有一种方法可以在不为每种可能的数据类型定义镜像的情况下解决这个问题?强制转换还是约束?约束在此处不适用。可以应用约束将T限制为结构或类、接口或给定基类以及具有无参数构造函数的项。你不能限制他们说“我希望T是字节、短或32色的。”对。我可以将ImageTools类修改为通用类,但它需要执行良好(这些操作中的每一个都针对其特定的数据类型进行了优化。例如,镜像一个短的just swaps shorts,但镜像一个Color32需要移动(本质上)4字节长)我能检测出哪种类型是“进入”和切换算法吗?我可能会选择一些常规的、老式的多态性,只使用ByteImageBuffer、ShortImageBuffer、Color32ImageBuffer,但我对您的问题了解得不够。泛型似乎不是正确的答案。即使您使用通用ImageTools类,您也可以尝试将其用于任何给定的T,这似乎不适合您的设计。你可以用
(如果typeof(T)==typeof(byte))
来切换算法,但这也很混乱。它将永远主宰你的命运。我明白了。是的,这是我第一次进入C泛型,我以前是C++模板的家伙。非常感谢。那么,有没有一种方法可以在不为每种可能的数据类型定义镜像的情况下解决这个问题?强制转换还是约束?约束在此处不适用。可以应用约束将T限制为结构或类、接口或给定基类以及具有无参数构造函数的项。你不能限制他们说“我希望T是字节、短或32色的。”对。我可以将ImageTools类修改为通用类,但它需要执行良好(这些操作中的每一个都针对其特定的数据类型进行了优化。例如,镜像一个短的just swaps shorts,但镜像一个Color32需要移动(本质上)4字节长)我能检测出哪种类型是“进入”和切换算法吗?我可能会选择一些常规的、老式的多态性,只使用ByteImageBuffer、ShortImageBuffer、Color32ImageBuffer,但我对您的问题了解得不够。泛型似乎不是正确的答案。即使您使用通用ImageTools类,您也可以尝试将其用于任何给定的T,这似乎不适合您的设计。你可以用
(如果typeof(T)==typeof(byte))
来切换算法,但这也很混乱。它将永远主宰你的命运。正如Anthony Pegram正确推断的那样,我需要它来处理几个类,而清单Color32、short、byte等不起作用(编译器总是说列表中的最后一个类必须排在第一位)正如Anthony Pegram正确推断的那样,我需要它来处理几个类,而清单Color32、short、byte等不起作用(编译器总是说列表中的最后一个类必须排在第一位)
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);
    }
}