To follow up on our announcement of releasing Rx 2.1, we'd like to let you know what changed in this release.

We have updated the Reactive Extensions for .NET, primarily to re-enable Windows Phone 8 support.  We ran into a bug with a partner team's tooling and the strong name crypto key we use to sign Rx.  To work around the problem, we had to change the crypto key back from a SHA-2 key to the SHA-1 key we used with Rx previously.  This affected our portable library and other flavors of Rx, so we recommend that you download a new version and recompile everything that depends on Rx. 

Additionally, we have decided to simplify our distribution story for developers.  Rx 2.1 binaries are available only on NuGet.  You can easily get this in Visual Studio by right clicking in your project's References tab and selecting "Manage NuGet packages..." then typing Rx in the search box.  Alternately, you can go to and use their package manager to install Rx on the command line if you desire.  Or you can grab the source from CodePlex and run with it.

Beyond the new strong name key, we've made a few minor additions:

*) Added several SelectMany overloads that provide you with indices, so you know which element in an IObservable or IEnumerable you're dealing with.  The simple overloads look like this:

 IObservable<TResult> SelectMany<TSource, TResult>(
    IObservable<TSource> source,
    Func<TSource, int, IObservable<TResult>> selector);

The more complex ones look like this:

 IObservable<TResult> SelectMany<TSource, TCollection, TResult>(
    IObservable<TSource> source,
    Func<TSource, int, IObservable<TCollection>> collectionSelector,
    Func<TSource, int, TCollection, int, TResult> resultSelector);

*) Added helper methods for dealing with anonymous types.  If you want to create instances of a generic type using an anonymous type as the type argument, that's not expressible in some languages like C#.  Instead, we can create a static generic method on a non-generic type that serves as a factory method and uses type inference to work around the lack of any name for the anonymous type.  Consider the following illegal and legal examples:

 DateTimeOffset time = ...;
var anonType = new { x = 5, y = "hi" };
var v = new Timestamped<typeof(anonType)>(anonType, time); // illegal
var v = Timestamped.Create(anonType, time); // legal

We used the anonymous type trick while testing SelectMany too!