L'implementazione di Enumerable.AsEnumerable<T>(this IEnumerable<T> source)
restituisce semplicemente source
. Tuttavia, Observable.AsObservable<T>(this IObservable<T> source)
restituisce un AnonymousObservable<T>
abbonandosi all'origine piuttosto che semplicemente restituendo la fonte.Perché AsObservable e AsEnumerable sono implementati in modo diverso?
Capisco che questi metodi siano davvero utili per modificare la monade all'interno di una singola query (passando da IQueryable => IEnumerable). Quindi perché le implementazioni differiscono?
La versione Observable
è più difensiva, nel senso che non puoi lanciare a qualche tipo noto (se originale sono state attuate come Subject<T>
si sarebbe mai in grado di lanciare come tale). Allora perché la versione Enumerable
non fa qualcosa di simile? Se il mio tipo sottostante è List<T>
ma lo esponi come IEnumerable<T>
tramite AsEnumerable
, sarà possibile eseguire il cast di nuovo su List<T>
.
Si prega di notare che questa non è una domanda su come esporre IEnumerable<T>
senza essere in grado di lanciare al sottostante, ma perché le implementazioni tra Enumerable
e Observable
sono semanticamente differenti.
Grazie per la spiegazione. Di recente ho visto un video su Channel 9 con Bart De Smet in cui spiegava IQbservable e la sua relazione con IObservable. Dal modo in cui l'ha spiegato, sembrava che AsObservable fosse l'analogo di AsEnumerable in quanto qualsiasi azione osservabile sarebbe avvenuta localmente piuttosto che remotamente. Ho completamente frainteso questo (probabilmente ...), o è semplicemente un altro uso di AsObservable? – RichK
Non lo so. Consiglio di porre questa domanda a Bart de Smet. –
Ok, grazie, probabilmente una buona idea. Ho letto la documentazione prima di chiedere - ma la confusione era il risultato del video menzionato nel mio precedente commento – RichK