使用String.Length时,Math.Ceiling给出"Call is ambiguous"错误

phu*_*der 3 c# compiler-errors

美好的一天.

几年后我又回到了C#,并且很少遇到我收到的错误.我写了一个练习程序,以确定一个单词是否是回文(相同的向后和向前).然而,我收到一个令我困惑的错误.

我试着调用Math.Ceiling(word.Length/2)来得到一个单词的中间部分,但是它给了我以下错误:"以下方法或属性之间的调用是不明确的:'​​Math.Ceiling(十进制)和Math.Ceiling(双)"

虽然我知道这是编译器担心识别正确的重载方法,但我不确定如何指出我正在使用的方法.我也不明白为什么要这么重要?

这是我的完整计划:

namespace ConsoleApplication2
{
    class Program
    {
        static void Main(string[] args)
        {
            string word = "Deleveled";
            word = word.ToUpper();
            bool isPalindrome = true;
            for (var i = 0; i <= Math.Ceiling(word.Length / 2); i++)
            {
                char tmp = word[word.Length - i - 1];
                if (Char.ToUpper(word[i]) != Char.ToUpper(tmp))
                {
                    isPalindrome = false;
                    break;
                }
            }
            Console.WriteLine(isPalindrome);
            Console.ReadLine();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

如果有人能帮我理解这里的问题,我将不胜感激.

我提前谢谢了

Mar*_*ell 7

整数除法总是产生整数; 所以:word.Length / 2返回int(它向下舍入).

当你调用Math.Ceiling它时,你传递一个整数,但没有 Math.Ceiling(int).它有两个选择:Math.Ceiling(double)Math.Ceiling(decimal),但是:它可以使用其中任何一个,从编译器的角度来看,这些都不是更好.

坦率地说,使用通用"页数"公式可能更简单:

int pages = (items + pageSize - 1) / pageSize;
Run Code Online (Sandbox Code Playgroud)

在这种情况下变得简单:

int upperLimit = (word.Length + 1) / 2;
Run Code Online (Sandbox Code Playgroud)

(请注意,也可以编写通用页面计数公式int pages = ((items - 1) / pageSize) + 1;,但在这种情况下,替换固定页面大小会更难)

  • @phunder 这个变量在堆栈上;堆栈上的额外变量“本质上”是免费的——堆栈已经被分配,并且存在可供使用。执行一次计算比每次迭代执行一次要高效得多。`Math.Ceiling(word.Length / 2.0)` 涉及双精度算术 - 这......当然,它会起作用,但实际上并不是必需的。对我来说,这意味着“有人需要计算页数,但不知道用整数数学来计算页数的公式”(我将“页数”与“你的一半”所代表的任何内容互换使用 - 相同的概念) (2认同)