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,建议不错。