C# 泛型函数:将T[]强制转换为复数[]

C# 泛型函数:将T[]强制转换为复数[],c#,arrays,generics,casting,C#,Arrays,Generics,Casting,我需要一个能在任何实值或复数数组上工作的函数 但是,对于函数本身,在复杂[]-数组上工作非常方便。因此,我想将任何不是Complex[](例如double[]或byte[]或int[])类型的数组类型转换为Complex[] 我认为这可能是我编写一个小型通用函数的一个很好的练习: private static Complex[] convertArrayToComplex<T>(T[] inpArr) { if (typeof(T) != typeof(Complex[]))

我需要一个能在任何实值或复数数组上工作的函数

但是,对于函数本身,在
复杂[]
-数组上工作非常方便。因此,我想将任何不是
Complex[]
(例如
double[]
byte[]
int[]
)类型的数组类型转换为
Complex[]

我认为这可能是我编写一个小型通用函数的一个很好的练习:

private static Complex[] convertArrayToComplex<T>(T[] inpArr)
{
    if (typeof(T) != typeof(Complex[]))
    {
        Complex[] inpArrC = new Complex[inpArr.Length];
        for (int k = 0; k < inpArr.Length; k++)
        {
            inpArrC[k] = new Complex((double)(object)inpArr[k], 0);
        }
        return inpArrC;
    } else
    {
        return inpArr; // Compiler-Error is here
    }
}
private static Complex[]convertarraytomplex(T[]inpArr)
{
if(typeof(T)!=typeof(Complex[]))
{
复数[]inpArrC=新复数[inpArr.Length];
for(int k=0;k
当然,这不起作用:编译器错误告诉我,
T[]
不能隐式转换为
Complex[]
。我确实理解这一点,但我看不到一种优雅的方式来实现我的目标


约束条件:我知道inpArr是一个数值数组。

你可以知道类型是相等的,但是你仍然需要说服编译器。此外,我会使用
is
而不是类型检查,从而使代码更清晰:

private static Complex[] convertArrayToComplex<T>(T[] inpArr)
{
    if (inpArr is Complex[])
    {
        return (Complex[])(object)inpArr;
    }

    Complex[] inpArrC = new Complex[inpArr.Length];

    for (int k = 0; k < inpArr.Length; k++)
    {
        inpArrC[k] = new Complex(Convert.ToDouble(inpArr[k]), 0);
    }

    return inpArrC;
}
private static Complex[]convertarraytomplex(T[]inpArr)
{
if(inpArr是复数[])
{
返回(复数[])(对象)inpArr;
}
复数[]inpArrC=新复数[inpArr.Length];
for(int k=0;k
您可以知道类型是相等的,但仍然需要说服编译器。此外,我会使用
is
而不是类型检查,从而使代码更清晰:

private static Complex[] convertArrayToComplex<T>(T[] inpArr)
{
    if (inpArr is Complex[])
    {
        return (Complex[])(object)inpArr;
    }

    Complex[] inpArrC = new Complex[inpArr.Length];

    for (int k = 0; k < inpArr.Length; k++)
    {
        inpArrC[k] = new Complex(Convert.ToDouble(inpArr[k]), 0);
    }

    return inpArrC;
}
private static Complex[]convertarraytomplex(T[]inpArr)
{
if(inpArr是复数[])
{
返回(复数[])(对象)inpArr;
}
复数[]inpArrC=新复数[inpArr.Length];
for(int k=0;k
您可以试试这个<代码>返回(复数[])inpArr谢谢。但是我需要返回
Complex[]
。这将给我一个错误“
T
无法转换为
Complex[]
”当您显然需要一个
数组时,为什么要使用
T
数组?为什么不将该方法定义为
convertaraytocomplete(double[]inpArr)
?泛型方法对于所有类型
t
的行为应该是一致的,因此应该避免这种类型检查。在这种情况下,您的函数仅适用于
double[]
输入,因为
(double)(object)inpArr[k]
强制转换对于任何其他类型都将失败。您实际上是在寻找
Convert.ToDouble(inpArr[k])
?这将检查实际的底层值类型,并找出转换为或提取double的正确方法?您可以试试这个<代码>返回(复数[])inpArr谢谢。但是我需要返回
Complex[]
。这将给我一个错误“
T
无法转换为
Complex[]
”当您显然需要一个
数组时,为什么要使用
T
数组?为什么不将该方法定义为
convertaraytocomplete(double[]inpArr)
?泛型方法对于所有类型
t
的行为应该是一致的,因此应该避免这种类型检查。在这种情况下,您的函数仅适用于
double[]
输入,因为
(double)(object)inpArr[k]
强制转换对于任何其他类型都将失败。您实际上是在寻找
Convert.ToDouble(inpArr[k])
?这将检查实际的底层值类型并找出转换或提取double的正确方法?您可能应该将
(double)(object)inpArr[k]
替换为
convert.ToDouble(inpArr[k])
,这将适用于许多其他数组类型(即
int[]
float[]
等),这是一个很好的建议。虽然这是OP的de代码,似乎已经起作用了,所以我不想在这方面做太多。好建议,我会在五分钟内接受答案。。。这很快:)用
returninparr.Select(number=>newcomplex(Convert.ToDouble(number),0)).ToArray()替换第二部分怎么样?如果使用Linq,建议不错。您可能应该将
(double)(object)inpArr[k]
替换为
Convert.ToDouble(inpArr[k])
,这将适用于许多其他数组类型(即
int[]
float[]
等),这是一个很好的建议。虽然这是OP的de代码,似乎已经起作用了,所以我不想在这方面做太多。好建议,我会在五分钟内接受答案。。。这很快:)用
returninparr.Select(number=>newcomplex(Convert.ToDouble(number),0)).ToArray()替换第二部分怎么样?如果使用Linq,建议不错。