【问题标题】:Casting concrete class to generic interface with interface as generic type results in invalid cast exception将具体类转换为具有接口作为泛型类型的泛型接口会导致无效的转换异常
【发布时间】:2016-01-15 13:20:39
【问题描述】:

我搜索了几篇关于我面临的问题的帖子,我找到了最相似的主题here

然而,这里我们有一个类作为泛型接口转换中的类型,并且当我检查类 SqlCommand 继承自 DbCommand 时,它实现了 IDbCommand。 我的例子: 我们有一个处理器类,假设有方法 Process。 处理器包含一个属性,该属性是下面描述的泛型类型的接口。

public class Processor
{
IDbTools<IDbCommand> DbTools {get; set;}

public Processor() {}

public void Process()
{
    DbTools = (IDbTools<IDbCommand>)new Tools();
    DbTools.PrepareAndExecuteQuery();
}
}

public class Tools : IDbTools<SqlCommand>
{
    public void PrepareAndExecuteQuery(SqlCommand command);
}

public interface IDbTools<in TCommand>
    where TCommand: IDbCommand
{
    void PrepareAndExecuteQuery(TCommand command);
}

在这个例子中,我们将收到一个 InvalidCastException,没有编译错误。如果 SqlCommand 继承自 DbCommand 并且它实现了 IDbCommand,我不明白为什么会发生这种情况。

我使它起作用的方法如下所示:

public class Processor<TCommand>
    where TCommand: IDbCommand, new()
{
IDbTools<TCommand> DbTools {get; set;}

public Processor() {}

public void Process()
{
    DbTools = (IDbTools<TCommand>)new Tools();
    DbTools.PrepareQuery();
}
}

public class Tools : IDbTools<SqlCommand>
{
    void PrepareAndExecuteQuery(SqlCommand command);
}

public interface IDbTools<TCommand>
    where TCommand: IDbCommand
{
    void PrepareAndExecuteQuery(TCommand command);
}

所以我的问题是,为什么会这样。当然如果我们实现

Tools : IDbTools<IDbCommand>

一切都会奏效,但为什么在这种情况下不行..

编辑: 我在 ideone.com 上附加示例:Code 相同的代码只是为了将过去的目的复制到新项目中。附加所需的命名空间。

还添加了 in 子句,这并不能解决问题。

【问题讨论】:

标签: c# generics interface casting


【解决方案1】:

你需要用in keyword声明你的IDbTools&lt;&gt;接口

public interface IDbTools<in TCommand>
    where TCommand: IDbCommand
{
    void PrepareAndExecuteQuery(TCommand command);
}

看到这里关于Covariance and Contravariance,微软可以比我解释得更好

【讨论】:

  • 我已经完成了,仍然收到 InvalidCastException。
  • 在哪里?此行绝对不正确,因为您没有变量名 DbTools = (IDbTools)new Tools();
  • 抱歉没有将它附加到这个代码中,只是在我的环境中测试它。我会更新问题帖。
  • 我修改了代码并附上了代码示例,仍然出现同样的错误。
猜你喜欢
  • 2013-01-08
  • 2016-10-20
  • 2023-03-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多