为什么我收到一个“;呼叫令人震惊”;尝试使用整数用户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
型才有效。我也想知道为什么?
有人能解释一下怎么了吗?
编译器会告诉你到底出了什么问题——调用不明确。事实上,您正试图使用调用的结果来分配到decimal
数组中,这与编译器无关——它只查看该方法的参数,以尝试确定要调用的方法。
表达式i/6
的类型是int
,它可以转换为double
和decimal
,两种转换都不比另一种"好",因此调用是不明确的。事实上,您根本不需要调用——您使用表达式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)
- 一个整数可以隐式地转换为
double
和decimal
,它们都有这种过载 - 两者都适用,因此会出现以下错误