有没有解决这种C#类型推断失败的方法?

bradgonesurfing

我有以下IObserver的C#扩展方法。它使我可以通过使用中间主题将LINQ表达式放在它的开头。

/// <summary>
/// Given an IObserver we may wish to build a new IObserver that has LINQ
/// combinators at it's head.
///
///     observer = observer.Wrap(observable=>observable.Where(k=>k>0));
///
/// </summary>
public static IObserver<U>
 Wrap<T,U>
 ( this IObserver<T> This
 , Func<IObservable<U>, IObservable<T>> fn 
 )
{
    var s = new Subject<U>();
    fn(s).Subscribe(This);
    return s;
}

但是当我使用该方法时

    [Fact]
    public void WrapShouldWrapObservers()
    {
        var b = new List<int>() { 0, 1, 2,3,4,5 };
        var s = new Subject<int>();
        var c = new List<int>();

        var obs = s.Wrap(observable => observable.Where(k => k > 3));

        s.Subscribe(v => c.Add(v));

        b.ToObservable().Subscribe(obs);
        c.Should().BeEquivalentTo(4, 5);

    }

我得到的错误

Error   2   The type arguments for method

ReactiveUI.Ext.IObservableMixins.Wrap<T,U>
( System.IObserver<T>
, System.Func<System.IObservable<U>,System.IObservable<T>>
)

cannot be inferred from the usage. Try specifying the type arguments
explicitly. 

当我显式输入args类型时,它就可以工作。

    var obs = s.Wrap<int,int>(observable => observable.Where(k => k > 3));

但是从检查来看,如果我将类型args排除在外,则没有任何歧义。这里有什么问题?

- - - - - -回答 - - - - - -

如果我更改测试用例以正确地使用类型,那么很明显问题出在哪里

    [Fact]
    public void WrapShouldWrapObservers()
    {
        var b = new List<int>() { 0, 1, 2,3,4,5 };
        var s = new Subject<string>();
        var c = new List<string>();

        var obs2 = s.Wrap<int,string>(observable => observable.Where(k => k > 3).Select(k=>k.ToString()));

        s.Subscribe(v => c.Add(v));

        b.ToObservable().Subscribe(obs2);
        c.Should().BeEquivalentTo("4", "5");
    }

无法知道observablelambda的第一个参数应该是什么。Lambda必须返回IObservable,但是可以实现此目的的类型是无限的。

不是。

问题在于您lambda中的观察者可以是任何类型。如果仅使用无法转换类型的LINQ运算符,则可以执行以下操作:

public static IObserver<T> Wrap<T> (this IObserver<T> this, 
    Func<IObservable<T>, IObservable<T>> fn)
{
    var s = new Subject<T>();
    fn(s).Subscribe(this);
    return s;
}

否则,您将必须执行不同的操作,并指定IObserver类型:

var obs = s.Wrap((IObserver<int> observer) => observer.Where(k => k > 3));

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

不明白为什么这种方法没有解决

GsonConverter没有解决

放心进口没有解决

绑定参数不适用于Firebird 2.0。有没有解决方法?

反应状态数组更新/渲染整个数组,有没有解决方法?

当数据提取单元格包含公式时,SPARKLINE错误。有没有解决方法?

ffmpeg的-画图字体字体颜色alpha有没有解决方法不能使用边框

反应useEffect警告:超出最大更新深度。有没有解决的办法?

有没有解决这个问题的设计模式?

没有错误,但 findviewbyid 没有解决

Unity Project没有解决方案文件

Javascript:Promise.all似乎没有解决

Promise 没有解决这个问题

expressJS 路由问题,简单的东西没有解决

猫鼬承诺没有解决

为什么没有解决“承诺{<pending>}”?

为什么“getLayoutInflater()”没有解决

我使用tm / mktime是否错误,是否没有解决方法?

如果我从“ sudo --login”运行“ sh -c”,则不会扩展位置参数。有没有解决的办法?

没有解决错误“函数调用不匹配”C++

有没有解决方案可以通过HTML在Google Chrome中显示日文文本

@FXML注释和FXMLLoader类没有解决的类型在Java中11和JavaFX 11

有没有办法在没有解决方案的情况下使用 Visual Studio 的 Klocwork 插件?

没有连接适配器;跳过布局没有解决方案工作

无法从源代码 (pypi) pipenv install confluent-kafka 1.4.0 - 似乎没有解决方法

有没有办法提示C#如何执行泛型类型推断?

Maxima解决方案没有解决方案

kinect工作室中的kinect v2灰色屏幕。USB控制器可能有问题吗?有没有解决此问题的方法?

该应用程序将无法打开,并会给显示java.lang.NullPointerException在日志猫,有没有解决?