2

私が行った場合、

public class test
{
    public int add(int a, float b)
    {
        return a + Convert.ToInt32(b);
    }

    public int add(float a, int b)
    {
        return Convert.ToInt32(a) + b;
    }
}

次に、正常にコンパイルされますが、実行時バインディングエラーが発生します。

The call is ambiguous between the following methods or properties

しかし、私がそうするなら

public class test
{
    public int add(int a, float b)
    {
        return a + Convert.ToInt32(b);
    }

    public int add(int a, int b)
    {
        return Convert.ToInt32(a) + b;
    }
}

次に、正しく機能し、test.add(1,2)の場合は2番目のaddメソッドを呼び出します。floatをdecimalに置き換えた場合にも機能します。

上記のエラーについて少し説明してもらえますか?

4

4 に答える 4

1

intは暗黙的にに変換可能floatであるため、最初の例では、コンパイラには2つの同等のオプションがありadd(1,2)、使用するオーバーロードを呼び出すかどうかを決定できません。これは、彼にヒントがないためです。

2番目のケースでは、変換の必要はなく、コンパイラーは最も適切なオーバーロードを選択します。

次のように、2番目のシナリオに別のメソッドを追加する場合:

public float add(float  a, float b)
{
    return a + b;
}

そして、次のような明示的なタイプのパラメータで呼び出しますadd(1f, 3);-呼び出されます

詳細を掘り下げるのではなく、コンパイラーは常に最も適切なオーバーロードを選択しようとし、可能な限り慣例を少なくしようとします。あいまいさで立ち往生している場合-エラーがスローされます。

于 2013-02-15T11:01:28.173 に答える
1

addメソッドに2つの整数または2つのfloatを渡しているようです。最初のケースでは、コンパイラは最初の引数をfloatに変換するか、2番目の引数を変換できます。したがって、呼び出すことができる2つのメソッドがあります。2番目のケースでは、単純に2つの整数でaddを呼び出します。

Better関数のメンバー定義を見てください。ファンクションメンバーの方が良いでしょう

引数ごとに、AXからPXへの暗黙の変換は、 AXからQXへの暗黙の変換よりも悪くはありません。

しかし、それはあなたのメソッドの各引数には当てはまりません。整数の引数を渡す場合、最初の引数だけが悪くなることはないからです。2番目の議論はもっと悪いです。(フロートの場合はその逆)

于 2013-02-15T11:00:19.090 に答える
1

これは、intが暗黙的にfloatに変換可能であるため、コンパイラーは最初のパラメーターをfloatに変換するか、2番目のパラメーターをfloatに変換するかを認識しないためです。どちらも同じように価値のある変換です。

呼び出しサイトで、2つのintではなく、floatとintを使用して呼び出して非難します。

test t  = new test();
t.add(1.0f, 2);
t.add(1, 2.0f);
于 2013-02-15T11:01:18.497 に答える
0

私はあなたのコーディング部分を私たち自身で試しました。エラーは発生しませんでした。

class Program
{

        public int add(int a, float b)
        {
            return a + Convert.ToInt32(b);
        }

        public int add(float a, int b)
        {
            return Convert.ToInt32(a) + b;
        }

    static void Main(string[] args)
    {

        Program pr = new Program();
       int k= pr.add(12, 203.9f);
       int kk = pr.add(203.9f, 12);
       Console.WriteLine(k);
       Console.WriteLine(kk);
    }
}

このコーディングをチェックしてください。

于 2013-02-15T11:35:01.130 に答える