【问题标题】:Generic Function With Abstract Class Implementations [duplicate]具有抽象类实现的通用函数[重复]
【发布时间】:2020-04-09 05:09:09
【问题描述】:

我正在尝试编写一个通用函数,如下图示例。 这个想法是有一个方法可以接收一个泛型类型,该泛型类型必须继承一个抽象类,该抽象类具有一个泛型配置,该配置具有另一个抽象类。

public class MainCode
{
    public MainCode()
    {
        Execute<DefaultOptions>();
    }

    public void Execute<T>() where T : BaseClassOptions<BaseClassConfiguration> { }
}

public class DefaultOptions : BaseClassOptions<DefaultConfiguration> { }

public abstract class BaseClassOptions<T> where T : BaseClassConfiguration
{
    public T Config { get; set; }
}

public class DefaultConfiguration : BaseClassConfiguration { }

public abstract class BaseClassConfiguration
{
    public string Host { get; set; }
}

但我收到以下错误:

你能帮帮我吗?

【问题讨论】:

  • 请不要将代码发布为图片。
  • 请不要将代码发布为图片。现在其他人不可能在搜索中找到它,或者只是将其复制粘贴到他们自己的 IDE 中进行尝试。请将您的代码作为代码块发布。
  • 我总是很难理解为什么,当输入代码是按ctrl-c,ctrl-v 并发布屏幕截图(最简单的方法)涉及启动截图工具,创建一个截图然后执行@ 987654326@,点击按钮,等待上传,如果需要移动占位符等等......为什么人们会走更难的路......
  • 在其他新闻中,你看到了吗? stackoverflow.com/questions/17434851/…
  • 请查看 Caius Jard 发布的链接。那里的答案清楚地解释了为什么BaseClassOptions&lt;DefaultConfiguration&gt;(这将是该示例中的Cage&lt;Tiger&gt;)不能用作BaseClassOptions&lt;BaseClassConfiguration&gt;(答案中的Cage&lt;Animal&gt;)。质疑你是否可以在没有接口的情况下做到这一点取决于你的代码实际上是如何工作的。如果您可以删除 BaseClassConfiguration 周围的通用 BaseClassOptions&lt;T&gt; 包装器并直接使用它,那么我认为它可能会起作用。但这取决于这是否可能。

标签: c# generics


【解决方案1】:

也许这对你有用?

    public MainCode()
    {
        Execute<DefaultOptions, DefaultConfiguration>();
    }

    public void Execute<T, T2>() where T : BaseClassOptions<T2> where T2: BaseClassConfiguration
    { }

问题是BaseClassOptions&lt;BaseClassConfiguration&gt; 不是DefaultOptions 的基类,这就是您收到此错误的原因。这是因为泛型类上的类型参数既不是covariant nor contravariant,即同一个泛型类的特化之间没有继承关系。如果您不想使用接口,可能值得直接说明编译器将哪个类用作基类型的泛型参数。

【讨论】:

  • 您能否解释一下这对 OP 有何作用?为什么他现有的代码不起作用?
  • @Enigmativity,我添加了一些额外的信息,也许现在答案更有用了。
  • 我已经这样做了并且它有效,但我的观点是:但我不明白为什么我不能像在我的代码示例中那样使用它。我的意思是:DefaultOptions 已经定义我将使用哪种类型的 BaseConfiguration,将其传递给基类。在我的 Execute 函数中将 DefaultConfiguration 作为泛型类型传递对我来说毫无意义
猜你喜欢
  • 1970-01-01
  • 2011-05-30
  • 1970-01-01
  • 1970-01-01
  • 2015-11-24
  • 2018-10-12
  • 2013-01-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多