Передача индексатора в качестве аргумента в C#

Когда я передаю индексатор в качестве аргумента по ссылке, в коде возникает ошибка времени компиляции.

  1. Почему нельзя передавать индексаторы с ключевыми словами ref или out?
  1. Каков механизм выделения памяти полям, которые инкапсулирует индексатор (когда мы устанавливаем какие-либо значения элементу индексатора класса Defining_Indexer)?
     using System;

    class Defining_Indexer

    {
        private string LanguageUser;
        //Declaring indexer
        public string this[int index]
        {
    get
    {
        return LanguageUser;
    }
    set
    {
        LanguageUser = value;
    }
        }
    }
    class Using_Indexer{

        //Declaring a method that will use indexer as argument
        public static string BestLanguage(ref string name)
        {


    //Here I want to show number of users of best language.
        Console.WriteLine("Number of user : ");
        //I want to modify the number of user Since parameter is initialized then best language 
        //users number is decided so there is no any fake.
        string declare = name + "2000";
        Console.WriteLine(declare);
        return declare;
    }//end of BestLanguage Method
    static void Main(string[] args)
    {
        Defining_Indexer result = new Defining_Indexer();
        //Here result elememts store the number of users of a some language.
        result[0] = "2315";//C
        result[1] = "4500";//C++
        result[2] = "44000";//C#
        BestLanguage(ref result[2]);//--Here is error
        Console.Write("Number of User by Main Method :");
        Console.WriteLine(result[2]);
    }
    }

Это ошибка времени компиляции

Свойство или индексатор нельзя передавать в качестве параметра ref или out.


person mdadil2019    schedule 14.06.2016    source источник
comment
Свойства и индексаторы — это всего лишь функции за кулисами. Вы не можете получить ссылки на них так же, как на обычные поля или переменные.   -  person Jeff Mercado    schedule 15.06.2016


Ответы (2)


Почему нельзя передавать индексаторы с ключевыми словами ref или out?

Потому что индексаторы фактически являются методами. Это не обязательно переменная с адресом в памяти, на которую вы можете передать «ссылку».

Вместо этого можно использовать временную локальную переменную:

result[2] = "44000";//C#
string temp = result[2];
BestLanguage(ref temp);
result[2] = temp;

Однако я хотел бы отметить, что ваш метод не изменяет ссылку, поэтому вообще нет необходимости делать его параметром ref!

person D Stanley    schedule 14.06.2016

  1. Индексаторы и свойства — это синтаксический сахар для функций.
  2. Не уверен, что полностью понимаю вопрос, но похоже, что вы спрашиваете, как индексатор разделяет сохраненные значения в другую память на основе значения индекса. Краткий ответ: это не так. Вы должны сделать это сами в наборе и получить функции.

То, как ваш индексатор реализован в настоящее время, независимо от того, какой результат [x] вы используете, вы перезапишете LanguageUser.

person Tyler Lee    schedule 14.06.2016