为什么我收到一个“;呼叫令人震惊”;尝试使用整数用户Math.Floor时出错

本文关键字:整数 出错 Floor Math 用户 呼叫 一个 为什么 | 更新日期: 2023-09-27 18:27:26

我刚刚制作了一个使用Floor方法的小程序:

public static void Main(string[] args)
    {
        int i;
        decimal[] t = new decimal[30];
        for(i=0; i<t.Length; i++)
        {
            t[i]=Math.Floor(i/6);
        }
        for(i=0; i<t.Length; i++)
        {
            Console.WriteLine(""+t[i]);
        }
        Console.ReadKey(true);
    }

但它不起作用。SharpDevelop返回此错误:

以下方法或属性之间的调用不明确:"System.Math.Floor(十进制)"answers"System.Math.Floor(双精度)"(CS0121)

与这条线有关:

t[i] = Math.Floor(i/6);

有人能解释一下怎么了吗?

另外:一开始我尝试编写int[] t = new int[30];,因为我的程序只返回整数。但它返回了第二个错误,说我应该使用类型decimal而不是类型int。我还尝试使用类型float和类型double,但都不起作用。似乎只有decimal型才有效。我也想知道为什么?

为什么我收到一个“;呼叫令人震惊”;尝试使用整数用户Math.Floor时出错

有人能解释一下怎么了吗?

编译器会告诉你到底出了什么问题——调用不明确。事实上,您正试图使用调用的结果来分配到decimal数组中,这与编译器无关——它只查看该方法的参数,以尝试确定要调用的方法。

表达式i/6的类型是int,它可以转换为doubledecimal,两种转换都不比另一种"好",因此调用是不明确的。事实上,您根本不需要调用——您使用表达式i / 6执行整数运算,它向零截断——这相当于非负数的Floor。不管怎样,你只想存储整数。。。你只需要:

public static void Main(string[] args)
{
    // While "values" isn't a particularly descriptive name, it's better
    // than "t"
    int[] values = new int[30];
    // Limit the scope of i - declare it in the loop header
    for (int i = 0; i < values.Length; i++)
    {
        values[i] = i / 6;
    }
    // You don't need the index here, so use a foreach loop. Generally prefer
    // foreach over for
    foreach (int value in values)
    {
        // You don't need any string concatenation here...
        Console.WriteLine(value);
    }
    Console.ReadKey(true);
}
  • for循环中的计数器是一个整数
  • 整数除以整数得到一个整数
  • 整数没有小数部分,所以调用Math.Floor一开始就没用
  • 因此,不存在过载Floor(int)
  • 一个整数可以隐式地转换为doubledecimal,它们都有这种过载
  • 两者都适用,因此会出现以下错误