questo è un problema con il modo dinamico opere - il legante runtime ha un problema con conversioni da System.Object
, ma in pratica, non è davvero un problema.
ho il sospetto che questo è perché dynamic
, in fase di esecuzione, è di per sé sempre System.Object
. La specifica del linguaggio C# in 4.7 afferma: "Il tipo dinamico non è distinguibile dall'oggetto in fase di esecuzione." In quanto tale, qualsiasi oggetto usato come dinamico viene semplicemente memorizzato come oggetto.
Quando si inserisce un'istanza effettiva di System.Object
in una dinamica, si verifica qualcosa all'interno della risoluzione di associazione del runtime che causa un'eccezione di riferimento null.
Tuttavia, qualsiasi altro tipo che non è System.Object
funziona - anche tipi di riferimento e simili, senza difetti. In quanto tale, questo dovrebbe fornire il comportamento corretto, poiché non ci sono davvero motivi per creare un'istanza di System.Object
che dovrebbe essere passata in giro - si vorrebbe sempre qualche sottoclasse con altre informazioni di tipo.
Non appena si utilizza un tipo "reale", questo funziona correttamente. Per exmaple, i seguenti lavori, anche se è passato e trattato come Object
:
public class Program
{
public static T TryGetArrayValue<T>(object[] array_, int index_)
{
dynamic boxed = array_[index_];
return (T)boxed;
}
private static void Main()
{
int p = 3;
object a = p;
var objects = new[] { a, 4.5 };
// This works now, since the object is pointing to a class instance
object v = TryGetArrayValue<object>(objects, 0);
Console.WriteLine(v);
// These both also work fine...
double d = TryGetArrayValue<double>(objects, 1);
Console.WriteLine(d);
// Even the "automatic" int conversion works now
int i = TryGetArrayValue<int>(objects, 1);
Console.WriteLine(i);
Console.ReadKey();
}
}
fonte
2012-03-29 19:18:06
Controllare per vedere se 'boxed' è null prima del casting. –
Questo probabilmente un bug nel modo in cui 'dynamic' è implementato. Controllando se questa repros in 4.5 ora. – dlev
Repro - e sembra un bug nel modo in cui viene gestito 'dynamic' - la domanda è valida – BrokenGlass