我有一个我试图设计的类,它使用dynamic
作为类型参数:
public class Idea : IEnumerable<dynamic>, IQueryable<dynamic>
{
}
编译器:无法实现动态界面
所以我有这个解决方法,我并不过分热衷于:
public class Idea<T> : IEnumerable<T>, IQueryable<T>
{
}
public class Idea : Idea<dynamic>
{
}
编译:成功!
我无法想出解决此问题的任何其他方式,而且我不确定是否要向用户公开Idea<T>
。
问题:
dynamic
接口?Idea<T>
?答案 0 :(得分:6)
我想解决你最重要的问题“为什么CLR不允许实现动态接口?”
仅仅因为它没有意义。请仔细阅读此blog post of Chris Burrows解释。
覆盖dynamic
成员,匹配签名等时会出现问题
例如,这条线说了很多:
但这是因为当我们查看方法覆盖和重载时,我们将对象和动态视为相同
是的,这是一个问题。该样本在文章中给出:
public class C
{
public void M(object x) { }
public void M(dynamic x) { }
}
这确实没有意义,虽然类型似乎有所不同,但在CLR世界中却没有。
虽然看起来有可能,但根据CLI团队的说法,这还需要做更多的工作。他们直到现在才发现这个有用:
元数据团队报告说,CLI规范的阅读似乎表明接口实现和自定义属性的表可能允许它,但无论如何,我们所知道的人从未这样做过,这本来就是努力的。 我们有优先事项和有限的时间预算,这并没有削减。
回答你的其他问题:是的,你是对的,解决方法感觉不好,而且可能是,但它似乎是现在唯一可行的解决方案。问问自己是否真的想要并且需要这个。如果是,请继续使用当前的解决方案。