O C# e outras linguagens .NET, apresentam um conceito conhecido como atributos de informações de chamada. Quando um desses atributos é usado em um parâmetro, o desenvolvedor não é responsável por fornecer o argumento correspondente: o compilador faz isso automaticamente. Atualmente, o C# suporta os atributos de informações de chamada para o nome/caminho do arquivo, o número da linha e o nome do método/propriedade de chamada. Com a nova proposta dos atributos de expressão de chamada, as expressões seriam adicionadas a essa lista; ou seja seria possível que desenvolvedores capturassem a expressões passadas a um método.,
Como exemplo, considere esses dois Asserts:
Assert.IsTrue(x - 7 > 0);
Assert.IsTrue(y - 3 > 0);
Se o teste falhar, fica difícil determinar qual dos Asserts foi acionado. Poderia ser incluída uma mensagem para cada Assert, mas isso seria entediante e correria o risco de ficar desatualizado. O que seria mesmo útil é se a expressão em si fosse capturada:
public static void IsTrue(bool condition, [CallerArgumentExpression("condition")] string message = null);
Neste exemplo, se o desenvolvedor não fornecer explicitamente uma mensagem, o compilador insere o código usado no argumento de condição. Essencialmente, o compilador transforma o código para que fique assim:
Assert.IsTrue(x - 7 > 0, "x - 7 > 0");
Assert.IsTrue(y - 3 > 0, "y - 3 > 0");
Dentro do design proposto, esse mecanismo de captura funcionaria até mesmo com métodos de extensão.
Problemas Potenciais
Três problemas foram citados com essa proposta:
Se um valor nulo ou uma string que não seja nome de parâmetro for fornecido, o compilador passará uma string vazia. Com um descompilador seria possível ver os códigos-fonte nos locais de chamada para os métodos marcados com o atributo. Isso pode ser visto como indesejável ou não-esperado para softwares proprietários.
Embora não seja uma falha da nova funcionalidade em si, uma fonte de preocupação pode ser a existência de uma API Debug.Assert, que hoje recebe apenas um bool. Mesmo que a sobrecarga recebendo uma mensagem tenha seu segundo parâmetro marcado com esse atributo e tornado opcional, o compilador ainda escolheria a opção sem mensagem ao fazer a resolução da sobrecarga. Portanto, a sobrecarga sem mensagem teria que ser removida para aproveitar a nova funcionalidade, significando uma alteração que levaria à quebra de binários (embora não de códigos-fonte).
Status
Atualmente, a proposta de atributos de expressão de chamada está listada no roadmap do C# com o status "Protótipo".