0

コンパイラが私の dto がラムダ式内で動的であると考える理由がわかりません。それはバグですか、それとも正当な理由がありますか?

[TestFixture]
public class DynamicTest
{
    public class Dto
    {
        public string Value { get; set; }
    }

    public Dto ToDto(dynamic d)
    {
        return new Dto();
    }

    [Test]
    public void dto_is_typed()
    {
        // var is Dto
        var dto = ToDto(new { dummy = true });
        dto.Value = "val";

        Assert.Inconclusive("yust for intellisense test");
    }

    [Test]
    public void dto_is_dynamic_inside_an_action_with_dynamic_type()
    {
        Action<dynamic> act = o =>
            {
                // dto is dynamic
                var dto = ToDto(o);
                dto.ThisIsNotAProperty = 100;
            };


        var ex = Assert.Throws<Microsoft.CSharp.RuntimeBinder.RuntimeBinderException>(() =>
            {
                act(new {dummy = true});
            });

        Assert.IsTrue(ex.Message.EndsWith("does not contain a definition for 'ThisIsNotAProperty'"));
    }
}
4

2 に答える 2

1

dto動的な引数を受け取るメソッドからの戻り値であるため、動的です。
引数により、実行時にオーバーロードのdynamic結果が発生し、呼び出される正確なメソッドがコンパイラに不明になります。

于 2013-05-03T10:09:12.713 に答える