11

私は次のコードを持っています:

class Calculator
    {
        public int Sum(int x, int y)
        {
            return x + y;
        }



        public int Sum(out int x, out int y)
        {
            x = y = 10;
            return x + y;
        }


    }

    class Program
    {
        static void Main(string[] args)
        {
            int x = 10, y = 20;
            Calculator calculator = new Calculator();

            Console.WriteLine ( calculator.Sum ( x , y ) );
            Console.WriteLine ( calculator.Sum ( out x , out y ) );

        }
    }

outこのコードは、メソッドのシグネチャがキーワードのみで区別されているにもかかわらず、うまく機能します。

しかし、次のコードは機能しませんでした:

class Calculator
    {

        public int Sum(ref int x, ref int y)
        {
            return x + y;
        }

        public int Sum(out int x, out int y)
        {
            x = y = 10;
            return x + y;
        }

    }


    class Program
    {
        static void Main(string[] args)
        {
            int x = 10, y = 20;
            Calculator calculator = new Calculator();

            Console.WriteLine ( calculator.Sum ( ref x , ref y ) );
            Console.WriteLine ( calculator.Sum ( out x , out y ) );

        }
    }

このコードが機能しなかったのはなぜですか? ref や out などのキーワードはメソッド シグネチャの一部ですか?

4

4 に答える 4

11

out パラメーター修飾子 (C# リファレンス)

ref キーワードと out キーワードは異なる実行時の動作を引き起こしますが 、コンパイル時にはメソッド シグネチャの一部とは見なされません。したがって、1 つのメソッドが ref 引数を取り、もう 1 つのメソッドが out 引数を取るという唯一の違いがある場合、メソッドをオーバーロードすることはできません。

参照: ref (C# リファレンス)

クラスのメンバーは、ref と out だけが異なるシグネチャを持つことはできません。型の 2 つのメンバーの唯一の違いが、一方に ref パラメーターがあり、もう一方に out パラメーターがある場合、コンパイラ エラーが発生します。

于 2013-11-01T15:32:20.023 に答える
1

これは仕様によるものです。MSDN ページアウト パラメーター修飾子によると (C# リファレンス)

ref キーワードと out キーワードは異なる実行時の動作を引き起こしますが、コンパイル時にはメソッド シグネチャの一部とは見なされません。したがって、1 つのメソッドが ref 引数を取り、もう 1 つのメソッドが out 引数を取るという唯一の違いがある場合、メソッドをオーバーロードすることはできません。たとえば、次のコードはコンパイルされません。

于 2013-11-01T15:32:47.733 に答える