C# 为什么我会收到一封“信”;电话是模棱两可的;尝试使用整数创建用户Math.Floor时出错?
我刚刚制作了一个使用C# 为什么我会收到一封“信”;电话是模棱两可的;尝试使用整数创建用户Math.Floor时出错?,c#,C#,我刚刚制作了一个使用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
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);
}
有人能给我解释一下怎么了吗
另外:起初我试着写int[]t=newint[30]因为我的程序只返回整数。但是它返回了第二个错误,说我应该使用类型decimal
而不是类型int
。我还尝试使用类型float
和类型double
,但也不起作用。似乎只有类型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);
}
publicstaticvoidmain(字符串[]args)
{
//虽然“值”不是一个特别描述性的名称,但它更好
//而不是“t”
int[]值=新的int[30];
//在循环头中限制i-declare的范围
for(int i=0;i
for
循环中的计数器是整数李>
- 整数除以整数得到整数李>
- 整数没有小数部分,因此首先调用
Math.Floor
是无用的李>
- 因此,没有过载
Floor(int)
李>
- 整数可以隐式转换为
double
和decimal
,两者都具有此重载李>
- 两者都适用,因此会出现以下错误
编译器在决定使用哪个重载时遇到问题,因为您使用的是int除以int的结果来调用它。您希望它使用哪个重载?您应该看看数学的定义。Floor
它要么使用双精度
,要么返回双精度
,要么使用十进制
和返回一个十进制
。在您的例子中,您将其传递2int
s,编译器不知道如何处理它们(将它们视为double
或decimal
)
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);
}