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
它要么使用
双精度
,要么返回
双精度
,要么使用
十进制
和返回一个
十进制
。在您的例子中,您将其传递2
int
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);
}