从泛型转换为泛型

时间:2015-05-30 13:32:24

标签: c# generics casting

简而言之,我试图让这段代码正常工作:

class it<X>
{
    X[] data;
    int pos;

    public Y get<Y>()
    {
        return (Y) data[pos];
    }
}

基本上,我有许多不同基元的数组需要作为不同的基元处理另一个地方。前面的代码不会编译,因为编译器不知道X和Y是什么。但是,确实如下:

    public Y get<Y>()
    {
        return (Y) (object) data[pos];
    }

然而,我得到运行时异常,如:

InvalidCastException: Cannot cast from source type to destination type.
it[System.Double].get[Single]()

这看起来很愚蠢,因为C#显然在浮点数和双打(以及其他基元)之间有一个强制转换。我猜它与拳击等有关,但我对C#很陌生,所以我不知道 - 我想我已经习惯了C ++模板。请注意,X和Y之间的转换始终存在 - 我可以用某种方式告诉编译器吗?

1 个答案:

答案 0 :(得分:1)

您可以使用 for (int y = 0; y < image.Height; y++) { for (int x = 0; x < image.Width; x++) { string path = @"E:\Example.txt"; Color pixel = image.GetPixel(x, y); if (!File.Exists(path)) { // File.Create(path); File.Create(path).Dispose(); using (TextWriter tw = new StreamWriter(path)) { tw.WriteLine("Value at" + x + "" + y + "" + "is:" +pixel); tw.Close(); } } else if (File.Exists(path)) { File.AppendAllText(path, "Value at"+"" + x + "" + y + "" + "is:" +""+ pixel + Environment.NewLine); //using (TextWriter tw = new StreamWriter(path)) //{ // tw.WriteLine("The next line!"); // tw.Close(); //} } if (pixel.R == keywordBytes[0] && pixel.G == keywordBytes[1] && pixel.B == keywordBytes[2]) { firstMatchingBytePos = new Point(x, y); KeywordFound(keyword, firstMatchingBytePos); } } } &#39; s Convert - 方法:

ChangeType

向您的类和方法添加一些generic constraints也可能是个好主意,以确保只能传递基元:

public Y get<Y>()
{
    return (Y)Convert.ChangeType(data[pos], typeof(Y));
}