1

在 C# 4.0b 中使用动态参数调用内部构造函数会导致以下异常

System.ArgumentNullException:值不能为空。参数名称:构造函数

示例代码(感谢 Jon Skeet)

public class Test
{
    internal Test(string x)
    {
    }

    static void Main()
    {
        dynamic d = "";
        new Test(d);
    }
}

似乎运行时在尝试选择正确的构造函数时没有考虑内部构造函数。这似乎是一个错误,所以我在 Connect 上发布了它: http ://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=472924

似乎他们为新版本修复了它。

4

2 回答 2

1

在没有看到代码的情况下,我建议您将一个未实例化的类传递给您的构造函数。在将它们传递给非动态对象之前,确保它们在范围内并已被实例化,例如使用 new。

编辑

在看到您的代码时,我建议您使用 DynamicObject 而不是 dynamic 作为您的辅助构造函数和 Entity 属性。

看到乔恩的回答后编辑

我认为问题在于使用 GetEntity() 方法生成动态对象实例。

我注意到 Jon 在他使用它的同一范围内创建了一个 MyDynamicObject 实例。

我假设您正在 GetEntity() 方法中生成对象的实例,在这种情况下,当您开始使用它时,它不再在范围内,被归类为本地对象。

使用“MyDynamicObject e = entity;” 将强制编译器隐式使用 MyDynamicObject 构造函数并将结果映射到它。因此,地址空间已经分配,​​并且在将其传递给 Helper 构造函数时可以使用。

于 2009-07-06T15:08:50.217 回答
1

编辑:好的,我现在已经对其进行了更深入的追踪——它使用了一个导致问题的内部构造函数。

这是一个非常简短但完整的示例,它演示了该问题:

public class Test
{
    internal Test(string x)
    {
    }

    static void Main()
    {
        dynamic d = "";
        new Test(d);
    }
}

我建议您使用Connect记录此内容- 然后在此处发布 URL,我们可以对其进行投票 :)

(我的猜测是在 DLR 内部调用 GetConstructor 时没有适当的 BindingFlags.NonPublic,但这只是猜测......)

于 2009-07-06T15:46:16.647 回答