.NET 4.0中动态语言运行时的限制是什么?

6

我知道在动态方法调用中,不支持匿名函数作为参数。除此之外,在.NET 4.0中,DLR还有哪些限制?

1个回答

11

可以 使用匿名函数,你只需要先将它们转换成所需类型:

dynamic list = new List<string>() { "10", "20" };
dynamic converted = list.ConvertAll((Func<string, int>) (x => int.Parse(x)));

方法组转换也是如此:

foo.Click += (EventHandler) MyClickHandler;

到目前为止我遇到的其他限制有:

  • 静态方法和构造函数不能在类型上动态,但可以在参数上动态
  • 你不能在类型约束中使用 dynamic
  • 你不能在类声明的接口中把 dynamic 作为类型参数,但你可以在基类中使用它作为类型参数,例如:

    class Invalid : IEnumerable<dynamic>
    class Valid : List<dynamic>
    
  • 在运行时无法发现扩展方法(但您可以使用动态参数直接调用静态方法)

  • 在4.0b1中存在一个错误,使您无法从dynamic[]转换为IEnumerable<dynamic> - 这将在发布版中得到修复。
  • 您不能将dynamic用作基类

(请注意,这些是C# 4.0和DLR本身的限制。尽管如此,我了解到这就是您的意思。)


1
所有委托的使用都需要强制转换,而不仅仅是匿名/lambda表达式吗?例如,在btn.Click += MyClickHandler;中,如果btn是动态的但确实具有Click事件,则这样做将无法正常工作。您需要在MyClickHandler方法名称周围添加强制转换。 - Daniel Earwicker
@Earwicker:并非所有委托的使用都需要,但您是正确的,方法组转换也需要进行强制转换。我会相应地更新我的答案。 - Jon Skeet

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接