Como faço para sobrecarregar o operador de colchetes em C #?
-
08-07-2019 - |
Pergunta
DataGridView, por exemplo, permite que você faça o seguinte:
DataGridView dgv = ...;
DataGridViewCell cell = dgv[1,5];
mas para a vida de mim eu não posso encontrar a documentação sobre o operador de índice / de colchetes. O que eles chamam? Onde é implementado? ele pode jogar? Como posso fazer a mesma coisa em minhas próprias classes?
ETA: Obrigado por todas as respostas rápidas. Resumidamente: a documentação pertinente está sob a propriedade "Item"; o caminho para a sobrecarga é declarar uma propriedade como public object this[int x, int y]{ get{...}; set{...} }
; o indexador para a DataGridView não joga, pelo menos de acordo com a documentação. Não menciona o que acontece se você fornecer coordenadas inválidos.
ETA Novamente: OK, apesar da documentação não faz nenhuma menção a ele (impertinente Microsoft!), Verifica-se que o indexador para o DataGridView irá de fato lançar uma ArgumentOutOfRangeException se você fornecê-lo com coordenadas inválidos. aviso justo.
Outras dicas
Essa seria a propriedade do item: http://msdn.microsoft.com /en-us/library/0ebtbkkc.aspx
Talvez algo como isso iria funcionar:
public T Item[int index, int y]
{
//Then do whatever you need to return/set here.
get; set;
}
Operators Overloadability
+, -, *, /, %, &, |, <<, >> All C# binary operators can be overloaded.
+, -, !, ~, ++, --, true, false All C# unary operators can be overloaded.
==, !=, <, >, <= , >= All relational operators can be overloaded,
but only as pairs.
&&, || They can't be overloaded
() (Conversion operator) They can't be overloaded
+=, -=, *=, /=, %= These compound assignment operators can be
overloaded. But in C#, these operators are
automatically overloaded when the respective
binary operator is overloaded.
=, . , ?:, ->, new, is, as, sizeof These operators can't be overloaded
[ ] Can be overloaded but not always!
Para suporte:
public Object this[int index]
{
}
MAS
O operador matriz indexação
A partir MSDN
public class CustomCollection : List<Object>
{
public Object this[int index]
{
// ...
}
}
Para CLI C ++ (compilado com / clr) ver este link MSDN .
Em suma, uma propriedade pode ser dado o nome de "default":
ref class Class
{
public:
property System::String^ default[int i]
{
System::String^ get(int i) { return "hello world"; }
}
};
Se você estiver usando C # 6 ou posterior, você pode usar sintaxe de expressão-bodied para get somente indexador:
public object this[int i] => this.InnerList[i];
Aqui está um exemplo de retornar um valor de um objeto lista interna. Deve dar-lhe a idéia.
public object this[int index]
{
get { return ( List[index] ); }
set { List[index] = value; }
}
Se você quer dizer o indexador série ,, Você sobrecarga que apenas por escrever uma propriedade indexador .. E você pode sobrecarregar, (escrever como muitos como você deseja) propriedades de indexador, desde que cada um tem uma assinatura de parâmetro diferente
public class EmployeeCollection: List<Employee>
{
public Employee this[int employeeId]
{
get
{
foreach(var emp in this)
{
if (emp.EmployeeId == employeeId)
return emp;
}
return null;
}
}
public Employee this[string employeeName]
{
get
{
foreach(var emp in this)
{
if (emp.Name == employeeName)
return emp;
}
return null;
}
}
}