C# 为什么动态过载解决方案不考虑扩展方法候选?

C# 为什么动态过载解决方案不考虑扩展方法候选?,c#,linq,dynamic,xelement,C#,Linq,Dynamic,Xelement,在上面的代码中,我以不同的方式创建了相同的xml,其中一种是显式的,被注释掉了。另一个是使用expandotomessageventexpandooobject,它返回一个XElement。 对我来说,这是一个谜: 如果我将xEvent声明为var xEvent,CLR会抱怨XElement上没有定义XPathEvaluate。事实并非如此;这是一种扩展方法。 现在代码段的方式(即xEvent声明为XElement)很好地工作。 如果我将以“dynamic”开头并在调用ExpandoToMess

在上面的代码中,我以不同的方式创建了相同的xml,其中一种是显式的,被注释掉了。另一个是使用expandotomessageventexpandooobject,它返回一个XElement。 对我来说,这是一个谜:

如果我将xEvent声明为var xEvent,CLR会抱怨XElement上没有定义XPathEvaluate。事实并非如此;这是一种扩展方法。 现在代码段的方式(即xEvent声明为XElement)很好地工作。 如果我将以“dynamic”开头并在调用ExpandoToMessageEvent方法的末尾结束的部分替换为当前已注释掉的部分,CLR会很高兴。 很明显,我能做到。但问题是:“动态”这个词为什么会抛弃CLR


我决定检查更多的东西,这里是我发现的:如果我将一个新的ExpandoObject传递给函数,那么var xEvent=ExpandoToMessageConverter.ExpandoToMessageEventnew ExpandoObject中的xEvent类型被正确确定,CLR很高兴。但是,如果我说动态BLAH=新的ExpEndoObjor,然后var vxEng= ExpToToMeExtEngEnBLAH,XEvter的类型没有被正确地确定,我认为CLR似乎不考虑XBel../P>< P>的扩展方法。但是,由于动态变量不经过编译时类型检查,动态工作良好,

< P>动态调用的过载解析不考虑扩展方法。
要确定给定调用上可用的扩展方法,需要知道调用站点上有效的using指令。我们以前没有将此信息持久保存到呼叫站点的机制;我们没有设计、实施、测试和记录新机制的预算,仍然按时交付C4。因此,我们切割了该部分特征

但是,如果指定了参数,扩展方法通常应该推断它们的返回类型?参数与此无关。对于Li0liQ来说,这就是奇怪的部分。显然,你说的是对的。我决定检查更多的东西,这里是我发现的:如果我将一个新的ExpandoObject传递给函数,那么var xEvent=ExpandoToMessageConverter.ExpandoToMessageEventnew ExpandoObject中的xEvent类型被正确确定,CLR很高兴。但是,如果我说动态BLAH=新的ExpEndoObjor,然后var vxEng= ExpToToMeExtEngEnBLAH,XEvter的类型没有被正确地确定,我认为CLR似乎不考虑XBeles的扩展方法。ExpExtOrthEaseAgEngEnter方法的签名是什么样子的?ExpandotomMessageEventExpandooObject,它返回一个XElement。。。它在post…@AlexeiOst中,但是如果使用var,它将被视为动态的。实际的类型并不重要。对ExpandotomessageEvent的调用是动态的,因此它返回动态的。
[TestFixture]
public class ExpandoToMessageConverterTests
{
/// <summary>
/// CanConvertEvent
/// </summary>
[Test]
public void CanConvertEvent()
{
    dynamic expandoEvent = new ExpandoObject();
    expandoEvent.PropertyOne = "pROPERTYoNE";
    expandoEvent.PropertyTow = "pROPERTYtWO";

    XElement xEvent=ExpandoToMessageConverter.ExpandoToMessageEvent(expandoEvent);

    /*var xEvent = new XElement("event",
                                new XElement("properties",
                                            new XElement("property",
                                                        new XAttribute("name", "pROPERTYoNE"),
                                                        new XAttribute("value", "someVal")),
                                            new XElement("property",
                                                        new XAttribute("name", "pROPERTYtWO"),
                                                        new XAttribute("value", "BLAH"))));*/
    Assert.IsNotNull(xEvent);
    var properties = new List<XElement>(xEvent.Descendants("properties"));
    Assert.AreEqual(1,properties.Count);


    var value = ((IEnumerable)xEvent.XPathEvaluate("properties/property")).Cast<XElement>();
    Assert.AreEqual(2, value.Count());
}