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

ser*_*0ne 5 c# generics clr interface dynamic

我有一个我试图设计的类,它dynamic用作类型参数:

public class Idea : IEnumerable<dynamic>, IQueryable<dynamic>
{
}
Run Code Online (Sandbox Code Playgroud)

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

所以我有这个解决方法,我不是太热衷于:

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

public class Idea : Idea<dynamic>
{
}
Run Code Online (Sandbox Code Playgroud)

编译:成功!

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

问题:

  1. 我觉得这里有代码味道......你能证实吗?
  2. 为什么CLR不允许实现dynamic接口?
  3. 我是否可以使用任何模式来实现这一目标而不暴露Idea<T>

Pat*_*man 7

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

仅仅因为它没有意义.阅读Chris Burrows的这篇博文,彻底解释了这一点.

覆盖dynamic成员,匹配签名等时会出现问题.

例如,这条线说了很多:

但这是因为当我们查看方法覆盖和重载时,我们将对象和动态视为相同

是的,那是一个问题.该样本在文章中给出:

public class C
{
    public void M(object x) { }
    public void M(dynamic x) { }
}
Run Code Online (Sandbox Code Playgroud)

这确实没有意义,虽然类型似乎有所不同,但在CLR世界中他们却没有.

虽然看起来有可能,但根据CLI团队的说法,这还需要做更多的工作.他们直到现在才发现这有用:

元数据团队报告说,CLI规范的读取似乎表明接口实现和自定义属性的表可能已经允许它,但无论如何,我们所知道的人都没有这样做过,而且本来会花费精力.我们有优先事项和有限的时间预算,这并没有削减.

回答你的其他问题:是的,你是对的,解决方法感觉不好,可能是,但它似乎是现在唯一可行的解​​决方案.问问自己是否真的想要并且需要这个.如果是,请继续使用当前的解决方案.