我有以下课程
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
有没有办法达到我想要的目的?
答案 0 :(得分:0)
您可以拥有没有约束的委托签名和函数的返回值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>()));
}
希望得到这个帮助。
答案 1 :(得分:0)
也许我对你真正想要的东西感到困惑,但是如果你只是希望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() { }
}