Подтвердить что ты не робот

Стационарные индексы не поддерживаются в С#?

Я пробовал это несколько разных способов, но я пришел к выводу, что это невозможно. Это языковая функция, которой я наслаждался с других языков в прошлом. Это просто то, что я должен просто списать?

4b9b3361

Ответ 1

Нет, статические индексы не поддерживаются в С#. Однако, в отличие от других ответов, я вижу, как можно легко указать их. Рассмотрим:

Encoding x = Encoding[28591]; // Equivalent to Encoding.GetEncoding(28591)
Encoding y = Encoding["Foo"]; // Equivalent to Encoding.GetEncoding("Foo")

Было бы относительно редко использоваться, я подозреваю, но мне кажется странным, что это запрещено - это дает асимметрию без какой-либо конкретной причины, насколько я могу видеть.

Ответ 2

Вы можете имитировать статические индексы с использованием статических индексированных свойств:

public class MyEncoding
{
    public sealed class EncodingIndexer
    {
        public Encoding this[string name]
        {
            get { return Encoding.GetEncoding(name); }
        }

        public Encoding this[int codepage]
        {
            get { return Encoding.GetEncoding(codepage); }
        }
    }

    private static EncodingIndexer StaticIndexer;

    public static EncodingIndexer Items
    {
        get { return StaticIndexer ?? (StaticIndexer = new EncodingIndexer()); }
    }
}

Использование:

Encoding x = MyEncoding.Items[28591]; // Equivalent to Encoding.GetEncoding(28591)   
Encoding y = MyEncoding.Items["Foo"]; // Equivalent to Encoding.GetEncoding("Foo")   

Ответ 3

Нет, но можно создать статическое поле, содержащее экземпляр класса, который использует индекс...

namespace MyExample {

   public class Memory {
      public static readonly MemoryRegister Register = new MemoryRegister();

      public class MemoryRegister {
         private int[] _values = new int[100];

         public int this[int index] {
            get { return _values[index]; }
            set { _values[index] = value; }
         }
      }
   }
}

... Кого можно получить в том виде, в котором вы собираетесь. Это можно проверить в окне Immediate...

Memory.Register[0] = 12 * 12;
?Memory.Register[0]
144