Статические индексаторы не поддерживаются в C#?[дубликат]

StackOverflow https://stackoverflow.com/questions/154489

  •  03-07-2019
  •  | 
  •  

Вопрос

На этот вопрос уже есть ответ здесь:

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

Это было полезно?

Решение

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

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

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

Другие советы

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

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")   

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

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; }
         }
      }
   }
}

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

Memory.Register[0] = 12 * 12;
?Memory.Register[0]
144
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top