定义可以返回具有通用参数类型的委托



我有以下类

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

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

也许我对您的实际想要的东西感到困惑,但是如果您只希望FF方法像您在评论中所说的那样返回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() { }
}

您可以具有代表的签名,而无需限制和返回的函数的返回值 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>()));
    }

相关内容

  • 没有找到相关文章

最新更新