【发布时间】:2019-03-05 06:59:11
【问题描述】:
我有以下声明:
private delegate ITask<Id> CreateObjectDelegateAsync<in T>(T @object)
where T : Model.Object;
我想将它存储在字典中:
Dictionary<Type, CreateObjectDelegateAsync<Model.Object>>
现在我收到错误,因为T 不是协变的,他无法转换它。我有多个委托,其派生 T 需要在该字典中。
T 必须是不变的,才能在参数中用作类型。对此有何想法或解决方法?
【问题讨论】:
-
你不能像你发现的那样这样做(好吧你至少不能以打字的方式这样做),我认为你可能需要重新考虑一下整个用例。
-
所以也许将它存储为一个 System.Delegate 并稍后再转换它?
-
我不太了解问题所在。如果您已完全应用类型参数(即
CreateObjectDelegateAsync<Whatever>),则不应涉及任何差异。你能粘贴错误是什么吗? -
问题是我使用具有派生类型的泛型,而不是特定类型。
-
@AsadSaeeduddin 我认为这个
with a derived T是这里的关键,这就是为什么它想要被违反,而它就是不可能的。是的,您将不得不走一条不太严格的类型/通用路线
标签: c# generics contravariance