繁体   English   中英

定义一个可以返回带有泛型参数的类型的委托

[英]defining a delegate that can return a type with a generic parameter

我有以下课程

public class MyClass
{
    public MyClass(){}
}

public class MyClass<T> : MyClass
{
    public MyClass(){}
}

我想定义一个可以返回Task<MyClass<T>>Task<MyClass>的委托。

我宣布如下。

public delegate Task<T> MyFunc<out T>() where T : MyClass;

但我得到一个错误

Invalid variance: The type parameter 'T' must be invariantly valid on 'MyFunc<T>.Invoke()'. 'T' is covariant.

如果我不使用out修饰符,而是使用委托返回MyClass<T>对象,如下所示

public Task<MyClass> ff(MyFunc<MyClass> f)
{
    return f();
}

public void aa()
{
    ff(() => Task<int>.Run(() => new MyClass<int>()));
}

我收到另一个错误

error CS0029: Cannot implicitly convert type 'System.Threading.Tasks.Task<MyClass<int>>' to 'System.Threading.Tasks.Task<MyClass>'
error CS1662: Cannot convert lambda expression to delegate type 'MyFunc<MyClass>' because some of the return types in the block are not implicitly convertible to the delegate return type

有什么方法可以实现我想要的吗?

您可以具有不受约束的委托的签名和该函数的返回值Task<int> ,如下所示:

    public delegate Task<T> MyFunc<T>();

    public Task<int> ff(MyFunc<int> f)
    {
        return f.Invoke();
    }

    public void aa()
    {
        ff(() => Task<int>.Run(() => 5 ));
    }

或者,如果要在委托签名中使用MyClass ,则应具有反映以下内容的代码:

    public delegate Task<T> MyFunc<T>() where T : MyClass;

    public Task<MyClass<int>> ff(MyFunc<MyClass<int>> f)
    {
        return f.Invoke();
    }

    public void aa()
    {
        ff(() => Task<MyClass<int>>.Run(() => new MyClass<int>()));
    }

希望能有所帮助。

也许我对您真正想要的东西感到困惑,但是如果您只是想让ff方法返回您对Daniele的注释中所述的Task<MyClass> ,那么我不确定为什么您不会只写这样的东西:

class Program
{
    public delegate Task<T> MyFunc<T>();

    public Task<MyClass> ff(MyFunc<MyClass> f)
    {
        return f();
    }

    public void aa()
    {
        ff(() => Task.Run(() => new MyClass()));
    }

}



public class MyClass
{
    public MyClass() { }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM