Vou resumir meu problema no seguinte trecho de código.
List<int> list = new List<int>() { 5, 56, 2, 4, 63, 2 };
Console.WriteLine(list.First());
O código acima está funcionando bem.
Agora eu tentei o seguinte
dynamic dList = list;
Console.WriteLine(dList.First());
mas estou recebendo RuntimeBinderException. Por que isso acontece?
this
é dinâmico aqui, mas se você pousar aqui, provavelmente também deve olhar para essa questãoRespostas:
Para expandir a resposta de Stecya ... os métodos de extensão não são suportados por tipagem dinâmica na forma de métodos de extensão , ou seja, chamados como se fossem métodos de instância. No entanto, isso funcionará:
Claro, isso pode ou não ser útil. Se você pudesse fornecer mais informações sobre por que e como está tentando usar a digitação dinâmica, talvez possamos ajudar mais.
fonte
dynamic
onde você realmente precisa ... basicamente, se de outra forma você acessasse os membros com reflexão, isso é um grande sinal. Por outro lado, sou um digitador estático obstinado - outros podem sugerir políticas menos pessimistas :)Para expandir a resposta de Jon, o motivo pelo qual isso não funciona é porque, em métodos regulares de extensão de código não dinâmico, funcionam fazendo uma pesquisa completa em todas as classes conhecidas pelo compilador para uma classe estática que possui um método de extensão correspondente. A pesquisa segue em ordem com base no aninhamento do namespace e
using
nas diretivas disponíveis em cada namespace.Isso significa que, para obter uma invocação de método de extensão dinâmica resolvida corretamente, de alguma forma o DLR precisa saber em tempo de execução quais são todos os aninhamentos de namespace e
using
diretivas em seu código-fonte . Não temos um mecanismo útil para codificar todas essas informações no site da chamada. Pensamos em inventar tal mecanismo, mas decidimos que era um custo muito alto e gerava muito risco de cronograma para valer a pena.fonte
dynamic
objetos são iguais a C # :,DynamicObject
então não há como diferenciá-los e esse é um dos motivos pelos quais não é possível adicionar métodos de extensãodynamic
, certo?Porque
First()
não é um método deList
. É definido na extensão Linq paraIEnumerable<>
fonte