1

C# 4.0b で動的引数を使用して内部コンストラクターを呼び出すと、次の例外が発生します。

System.ArgumentNullException: 値を null にすることはできません。パラメータ名:コンストラクタ

サンプルコード (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を使用してインスタンス化されていることを確認してください。

編集

コードを確認したら、ヘルパーcostructorとEntityプロパティに動的ではなくDynamicObjectを使用することをお勧めします。

ジョンの答えを見た後に編集する

問題は、GetEntity()メソッドを使用して動的オブジェクトインスタンスを生成することにあると思います。

Jonは、MyDynamicObjectのインスタンスを、彼が使用しているのと同じスコープ内に作成していることに注意してください。

GetEntity()メソッド内でオブジェクトのインスタンスを生成していると仮定します。この場合、ローカルオブジェクトとして分類され、使用するときにスコープ内になくなります。

「MyDynamicObjecte=entity;」を使用する コンパイラーにMyDynamicObjectコンストラクターを暗黙的に使用させ、結果をそれにマップします。したがって、アドレススペースはすでに割り当てられており、ヘルパーコンストラクターに渡すときに使用されるスコープ内にあります。

于 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 内で、適切な BindingFlags.NonPublic なしで GetConstructor への呼び出しが行われていると思いますが、それは単なる推測です...)

于 2009-07-06T15:46:16.647 に答える