Perché questo:.net colata di difficoltà interi fanno decimali
(new[]{1,2,3}).Cast<decimal>();
risultato in un
InvalidCastException: specificato cast non è valido.
Perché questo:.net colata di difficoltà interi fanno decimali
(new[]{1,2,3}).Cast<decimal>();
risultato in un
InvalidCastException: specificato cast non è valido.
Sì, Cast
non lo fa. Fondamentalmente fa riferimento alle conversioni e alle conversioni non in scatola, non alle conversioni tra diversi tipi di valore.
Utilizzare questo invece:
(new[]{1,2,3}).Select(x => (decimal)x)
Nota che pre-.NET 3.5 SP1, Cast
fatto alcuni più conversioni di quanto non faccia ora. Non so se sarebbe stato utile o meno, ma sicuramente non ora.
Cast non convertito.
Quando si utilizza il metodo di estensione Cast, si sta provando a trasmettere un elemento in base allo schema di ereditarietà. Dal momento che int non deriva dal decimale, questo non può essere fatto usando Cast. Prova invece:
(new[] {1,2,3}).Select(x => (decimal)X);
Sei troppo veloce. :) –
Per alcune considerazioni sul perché le conversioni di unboxing da int in scatola a decimali non in casella non funzionano, consultare http://blogs.msdn.com/ericlippert/archive/2009/03/19/representation-and-identity.aspx per i dettagli . –
@Eric: Continuo a dimenticare che 'Cast' è su' IEnumerable' (e quindi oggetti) piuttosto che 'IEnumerable' - quindi perché si tratta di una conversione di unboxing piuttosto che una conversione tra due tipi di valore. (Non che un cast dritto funzionerebbe in quel caso). Intendiamoci, non posso * mai * trovare il post in cui spieghi cosa era solito fare 'Cast' (prima di SP1). –