1

説明が欲しいです。タイプ T のリストを取得して Delegate メソッドを実行する汎用クラスがありますが、クラスに IEnumerable を渡して、List、Dictionary などを処理できるようにしたいと考えています。

このコードを仮定すると:

        public static class GenericClass<T>
        {
            public delegate void ProcessDelegate(ref IEnumerable<T> p_entitiesList);

            public static void ExecuteProcess(ref IEnumerable<T> p_entitiesList, ProcessDelegate p_delegate)
            {
                p_delegate(ref p_entitiesList);
            }
        }


        public static void Main()
        {
          GenericClass<KeyValuePair<string, string>.ProcessDelegate delegateProcess = 
                new GenericClass<KeyValuePair<string, string>.ProcessDelegate(
                delegate (ref IEnumerable<KeyValuePair<string, string>> p_entitiesList)
                    {
                        //Treatment...
                    });

          Dictionary<string, string> dic = new Dictionary<string, string>;
          GenericClass<KeyValuePair<string, string>>.ExecuteProcess(ref dic, delegateProcess);
            //I get this error : 
            //  cannot convert from ref Dictionary<string, string> to ref IEnumerable<KeyValuePair<string, string>>
        }

Dictionary は IEnumerable から継承して KeyValuePair を使用するため、Dictionnary を KeyValuePair の IEnumerable として渡すことができない理由について説明をお願いします。

また、これを行うより良い方法はありますか?

4

1 に答える 1

6

refパラメータなので。

refパラメータは、メソッドが呼び出し元から渡されたフィールド/変数に新しい値を割り当てることができることを意味します。

あなたのコードが正当なものであれば、メソッドは a を割り当てることができますがList<KeyValuePair<string, string>>、これは明らかに間違っています。

パラメータは使用しないでrefください。

于 2013-08-09T19:39:34.790 に答える