C#运营商' +'不能应用于' double []'类型的操作数和' ulong'

时间:2017-06-18 15:15:56

标签: c# output operator-keyword

美好的一天,

作为C#newbie,我面临着C#的另一个问题,即在C中根本没有问题。

我有这个调用其他方法的方法,看起来像这样。

public double ipoval(double[] xa,double[] ya, int n, double x, int ipord)
{
    ulong ind, jnd;
    double y, dy;
    if (ipord>=1)
    {
        hunt(xa,Convert.ToUInt64(n),x, ind);
        jnd = Math.Min(Math.Max(ind - ipord / 2, 1), n - ipord);
        polint(xa + jnd - 1, ya + jnd - 1, ipord + 1, x, y, dy);
    }
    return y;
}

现在它向我展示了jnd的错误:

  • 错误1运营商' - '不能应用于'ulong'类型的操作数和' int'
  • 错误2最佳重载方法匹配' System.Math.Max(十进制,十进制)'
  • 错误3参数1:无法转换为' object'到'十进制'

看起来C#在减去两种不同的数据类型方面存在问题。我应该将int ipord转换为ulong吗?

方法polint有类似错误的错误:

  • 错误4运营商' +'不能应用于' double []'类型的操作数和' ulong'
  • 错误5运营商' +'不能应用于' double []'类型的操作数和' ulong'

有什么想法吗?提前感谢您的帮助。

我在C中有同样的事情并且有效:

NRREAL ipoval(NRREAL xa[], NRREAL ya[], const int n, const NRREAL x, const int ipord)
{
    unsigned long ind,jnd;
    NRREAL y,dy,*y2;
    if (ipord>=1) { /* polynomial interpolation of ipord-th order */
        hunt(xa,(unsigned long)n,x,&ind);
        jnd=IMIN(IMAX(ind-ipord/2,1),n-ipord);
        polint(xa+jnd-1,ya+jnd-1,ipord+1,x,&y,&dy);
    }
    return y;
}

顺便说一句小问题,在c#中的polint方法中使用如下参数:

public void polint(double[] xa, double[] ya, int n, double x, ref double y, ref double dy)

因为我想要y,dy作为该void方法的输出。

很抱歉很长的帖子,再次感谢。

3 个答案:

答案 0 :(得分:1)

我认为应该这样做:

MainWindow

答案 1 :(得分:0)

你有几个错误;首先,您必须为变量分配初始值,无论是new ulong()还是直接值,例如ulong a = 0;

接下来,在您使用Math.Max(...)的行中,您在intulong之间使用减号运算符,这会引发另一个错误;当使用上述两种不同的数值类型时,你大部分时间都想把范围较小的数字类型转换为范围较大的那个,因为较小范围的限制是,更小,更大的变量可以肯定包含较小的一个。在我举一个例子之前,同一行中还有另一个错误;有多个Math.Min个,一个用于decimal,另一个用于float。问题是ulong可以隐式地转换为其中任何一个,这意味着您可以执行float r = b //where b is a ulongdecimal r = b //where b is still a ulong因此,您必须明确强制转换以指定您想要小数,或者Math.Min的浮动版本以下是一个例子:

jnd = (ulong)Math.Min(Math.Max(ind - (ulong)ipord / 2, 1), (decimal)(n - ipord));

度过愉快的一天!!!

答案 2 :(得分:0)

非常感谢大家。我确实在你的帮助下改变了它,现在看起来像这样:

public double ipoval(double[] xa, double[] ya, int n, double x, int ipord)
    {
        ulong ind = 0, jnd = 0;
        double y = 0, dy = 0;
        if (ipord >= 1)
        {

            hunt(xa, (ulong)n, x, ref ind);
            jnd = (ulong)Math.Min(Math.Max(ind - (ulong)ipord / 2, 1), (decimal)(n - ipord));
            polint(xa[jnd - 1], ya[jnd - 1], ipord + 1, x, ref y, ref dy);
        }
        return y;
    }

但是polint仍然给我错误。

错误1最好的重载方法匹配' program.Methods.polint(double [],double [],int,double,ref double,ref double)'

错误2参数1:无法转换为' double'到['加倍[]'

错误3参数2:无法转换为' double'到['加倍[]'