【问题标题】:Store multiple contravariant delegates in a dictionary在字典中存储多个逆变委托
【发布时间】: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&lt;Whatever&gt;),则不应涉及任何差异。你能粘贴错误是什么吗?
  • 问题是我使用具有派生类型的泛型,而不是特定类型。
  • @AsadSaeeduddin 我认为这个with a derived T 是这里的关键,这就是为什么它想要被违反,而它就是不可能的。是的,您将不得不走一条不太严格的类型/通用路线

标签: c# generics contravariance


【解决方案1】:

所以解决方案非常简单:虽然我不能直接在这里使用不变性,但我可以使用:

Dictionary<Type, Delegate>

相反。无论泛型类型如何,我都可以为其分配任何委托。然后稍后在获得委托时,我只需要将其转换为

CreateObjectDelegateAsync<T>

再次。

像这样(假设T 是字典中的现有类型):

(CreateObjectDelegateAsync<T>)DelegateDictionary[typeof(T)]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多