(C #) por que o Visual Studio diz que é um objeto enquanto o GetType diz que é um Func <object>?
C # novato pergunta aqui. O código a seguir (tirado do livro "C # From Novice to Professional" por Christian Gross, Apress) dá um erro:
<code>worksheet.Add("C3", CellFactories.DoAdd(worksheet["A2"], worksheet["B1"])); </code>
A razão é que o métodoDoAdd()
não aceita os argumentos dados.
<code>public static Func<object> DoAdd(Func<object> cell1, Func<object> cell2) {...} </code>
VS alega que ambos os argumentos na chamada de método acima são do tipoobject
enquanto o método aceita apenasFunc<object>
. Mas ovalor dos dois elementos da planilha é do tipoFunc<object>
:
<code>worksheet.Add("A2", CellFactories.Static(10.0)); </code>
onde issoStatic
método apenas retorna o valor dado:
<code>public static Func<object> Static(object value) { return () => value; } // return type= Func<object> </code>
Quando eu façoworksheet["A2"]
ComoFunc<object>
, o código funciona.
Mas há algo que não entendo. O tipo da instância do objeto éFunc<object>
. Eu usei oGetType()
método para ver a prova disso, e comparar os tipos de objetos dos elementos originais com os do objeto de elenco (que é aceito):
<code>Console.Writeline(worksheet["A2"].GetType()); // now cast to the correct type (why can't it do that implicitly, btw?) Funk1 = worksheet["A2"] as Func<object>; Console.Writeline(Funk1.GetType()); </code>
.. e eles são todos idênticos! (Tipo =System.Func'1[System.Object]
)
E mesmo quando eu uso o.Equals()
método para comparar os dois tipos, retornatrue
.
No entanto, o VS vê a primeira instância do objeto como tipoobject
na chamada do método. Por quê? Por que o método chamado 'vê' o argumento como um tipo diferente do que o GetType () retorna? (e se sim, que bom é oGetType()
método?)
Muito obrigado pelo seu conselho / comentários! (É meio difícil aprender a língua se os exemplos do livro derem um erro e você não perceber o motivo - daí a impressão vaga de que algo está errado ouGetType()
ou VS.)