【问题标题】:How can I avoid double casting?如何避免双重铸造?
【发布时间】:2012-10-08 08:11:00
【问题描述】:

我得到了以下类层次结构:

MssqlDataSource<T>:DataSource<T>:IDataSource<T>:IQueryable<T>

MssqlDataSource 类中我得到了属性:

private Table<T> Table { get { return (Table<T>)(IQueryable<T>)this; } }

并且双重转换(thisIQueryable,然后到 Table)不能简化为 (Table&lt;T&gt;)this 或只是 this,因为我收到编译错误。


private Table<T> Table { get { return (Table<T>)this; } }

产生:


那么怎么解决呢?如何只使用一个转换(或者最好不使用)来避免编译错误?为什么会出现?

【问题讨论】:

  • MssqlDataSource&lt;T&gt; 是否被标记为 sealed
  • 你说的好像很明显……不过请参考我刚才问的this question,可能会扩大理解,但可能不会直接回答。
  • @AgentFire as 实际上可以更快,因为它不对演员进行类型检查。如果您的项目将是正确的类型,则最终结果将与强制转换相同。这完全与编译器保证有关,这基本上是将责任从编译器转移到运行时。
  • @AgentFire 我理解这一点,但是你想删除强检查(和错误),但你总是希望类型是表类型的实例。要么 100% 确定并使用as,要么只进行手动转换。
  • @AgentFire:看来this 不是 Table&lt;T&gt;。那你为什么要把它投射到Table&lt;T&gt;?我不明白为什么你还没有让代码工作时担心性能...

标签: c# interface casting


【解决方案1】:

据此:

MssqlDataSource<T>:DataSource<T>:IDataSource<T>:IQueryable<T>

MssqlDataSource&lt;T&gt; 不继承自 Table&lt;T&gt;

为什么要进行这种转换?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-08-12
    • 2011-05-09
    • 1970-01-01
    • 2023-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多