Код: Выделить всё
public static class ObservableExtensions
{
///
/// Returns a sequence that is generated by comparing each of an underlying Observable's emitted values to the value which was emitted first.
/// The first item emitted by this Observable is the result of comparing the first item to itself.
///
public static IObservable RelativeToFirst(this IObservable observable, Func selector)
{
// .Publish ensures the underlying stream is not disposed until this stream is unsubscribed.
return observable.Publish(published => published.Take(1)
.CombineLatest(published)
.Select(((TValue First, TValue Current) combined) => selector(combined.First, combined.Current)));
}
}
Код: Выделить всё
public class ObservableExtensionsTests
{
[Fact]
public async Task RelativeToFirst()
{
var input = Observable.Range(5, 10);
var expected = Observable.Range(0, 10);
var result = input.RelativeToFirst((initial, current) => current - initial);
Assert.Equal(await expected.ToArray(), await result.ToArray());
}
}
Мне нужен My .Extensions.Reactive для работы с netstandard2.0, чтобы я мог использовать ее в проектах, ориентированных на более новые версии .NET, сохраняя при этом поддержку .NET 4.8. Однако когда я меняю TargetFramework на netstandard2.0 и переустанавливаю пакеты NuGet System.Reactive 6.0.1, модульный тест, который по-прежнему нацелен на net48, завершается сбоем, выдавая ошибку следующий вывод xUnit:
Код: Выделить всё
System.MissingMethodException
Method not found: 'System.IObservable`1 System.Reactive.Linq.ObservableEx.CombineLatest(System.IObservable`1, System.IObservable`1)'.
at My.Extensions.Reactive.ObservableExtensions.c__DisplayClass2_0`2.b__0(IObservable`1 published)
at System.Reactive.Linq.ObservableImpl.Multicast`3._.Run(Multicast`3 parent)
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
at System.Reactive.Subjects.AsyncSubject`1.GetResult()
at My.Extensions.Reactive_Test.ObservableExtensionsTests.d__0.MoveNext() in redacted\ObservableExtensionsTests.cs:line 19
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at Xunit.Sdk.TestInvoker`1.c__DisplayClass47_0.d.MoveNext() in /_/src/xunit.execution/Sdk/Frameworks/Runners/TestInvoker.cs:line 259
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at Xunit.Sdk.ExecutionTimer.d__4.MoveNext() in /_/src/xunit.execution/Sdk/Frameworks/ExecutionTimer.cs:line 48
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at Xunit.Sdk.ExceptionAggregator.d__9.MoveNext() in /_/src/xunit.core/Sdk/ExceptionAggregator.cs:line 90
Отсутствующий метод System.Reactive.Linq.ObservableEx.CombineLatest() прост для перехода к использованию метода «Перейти к определению» Visual Studio. Ошибка модульного теста возникает во время ошибки выполнения, а не во время компиляции. Тестовый проект не ссылается напрямую на пакет NuGet System.Reactive, но требуемая DLL, похоже, присутствует в папке bin\x64 тестового проекта.

Подробнее здесь: https://stackoverflow.com/questions/790 ... s-missingm