public void Zip() { Nullable <int> n = 2; Nullable <int> n0 = null; Assert.Throws <ArgumentNullException>(() => NullableExtensions.Zip <int, int, int>(n, n, null)); Func <int, int, int> selector = (a, b) => a + b; Func <int, int, int> fail = (a, b) => throw new InvalidOperationException("Should not be called"); Assert.True(n.Zip(n, selector).HasValue); Assert.False(n0.Zip(n, selector).HasValue); Assert.False(n.Zip(n0, selector).HasValue); Assert.False(n0.Zip(n0, selector).HasValue); Assert.Equal(4, n.Zip(n, selector).Value); Assert.False(n0.Zip(n, fail).HasValue); Assert.False(n.Zip(n0, fail).HasValue); Assert.False(n0.Zip(n0, fail).HasValue); Assert.Equal((2, 2), n.Zip(n).Value); }