接口<;动态>;C#中不允许使用-解决方法

本文关键字:解决 不允许 方法 lt 动态 gt 接口 | 更新日期: 2023-09-27 18:27:20

我正在尝试设计一个使用dynamic作为类型参数的类:

public class Idea : IEnumerable<dynamic>, IQueryable<dynamic>
{
}

编译器:无法实现动态接口

所以我有一个我不太喜欢的变通方法:

public class Idea<T> : IEnumerable<T>, IQueryable<T>
{
}
public class Idea : Idea<dynamic>
{
}

编译器:成功

我想不出任何其他方法来解决这个问题,我也不确定是否要向用户公开Idea<T>

问题:

  1. 我觉得这里有代码的味道。。。你能确认一下吗
  2. 为什么CLR不允许实现dynamic接口
  3. 在不暴露Idea<T>的情况下,有什么模式可以用来实现这一点吗

接口<;动态>;C#中不允许使用-解决方法

我想解决您最重要的问题"为什么CLR不允许实现动态接口?"

只是因为它没有意义。阅读Chris Burrows的这篇博客文章,它对这一点进行了彻底的解释。

例如,覆盖dynamic成员、匹配签名等时会出现问题。

例如,这句话说明了很多:

但这是因为当我们观察方法重写和重载时,我们将对象和动态视为相同的

是的,这是个问题。该样品在文章中给出:

public class C
{
    public void M(object x) { }
    public void M(dynamic x) { }
}

这确实没有意义,尽管类型似乎有所不同,但在CLR世界中却没有。

尽管这似乎是可能的,但根据CLI团队的说法,这需要做更多的工作。直到现在,他们才发现这对实现有用:

元数据团队报告说,对CLI规范的阅读似乎表明,接口实现和自定义属性的表可能允许它,但无论如何,据我们所知,没有人这样做过,这将是一项耗费精力的工作我们有优先事项和有限的时间预算,但这并不能削减开支

回答你的其他问题:是的,你是对的,变通方法感觉很糟糕,很可能是这样,但这似乎是目前唯一可行的解决方案。问问自己,你是否真的想要和需要这个。如果是,请继续使用当前的解决方案。