São indexadores estáticos não é suportado em C #? [duplicado]
Pergunta
Esta questão já tem uma resposta aqui:
- estática indexadores? 7 respostas
Eu tenho tentado isso de algumas maneiras diferentes, mas estou chegando à conclusão de que não pode ser feito. É um recurso de linguagem que eu tenha gostado de outras línguas no passado. É apenas algo que eu deveria apenas escrever off?
Solução
Não, indexadores estáticas não são suportados em C #. Ao contrário de outras respostas, no entanto, não vejo como poderia facilmente ser o ponto em tê-los. Considere o seguinte:
Encoding x = Encoding[28591]; // Equivalent to Encoding.GetEncoding(28591)
Encoding y = Encoding["Foo"]; // Equivalent to Encoding.GetEncoding("Foo")
Seria relativamente raramente usado, eu suspeito, mas eu acho que é estranho que é proibido -. Ele dá assimetria por nenhuma razão em particular, tanto quanto eu posso ver
Outras dicas
Você pode simular indexadores estáticos usando propriedades estáticas indexados:
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()); }
}
}
Uso:
Encoding x = MyEncoding.Items[28591]; // Equivalent to Encoding.GetEncoding(28591)
Encoding y = MyEncoding.Items["Foo"]; // Equivalent to Encoding.GetEncoding("Foo")
Não, mas é possível criar um campo estático que contém uma instância de uma classe que usa um indexador ...
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; }
}
}
}
}
... O que poderia ser acessado da maneira que você está pretendendo. Isso pode ser testado na janela imediata ...
Memory.Register[0] = 12 * 12;
?Memory.Register[0]
144