为什么一个急切加载的延迟加载器会抛出错误?

Why does an eager-loading lazy-loader throw an error?

我们有以下代码,除非我们强制延迟加载器停止延迟,否则它会抛出一个

System.MissingMemberException: 'The lazily-initialized type does not have a public, parameterless constructor.'

异常。至少,对于我们已经拥有价值的情况,我们只是让延迟加载程序反刍它。

我的问题是 - 为什么?为什么会这样,我该怎么做才能不需要包含 var _ = _lazyChild.Value;?

public class MyContainedClass
{
    private readonly int _id;

    public MyContainedClass(int id) => _id = id;
}

public class MyContainer
{
    private readonly Lazy<MyContainedClass> _lazyChild;

    public MyContainer(MyRepository repo, int? childId, MyContainedClass child = null)
    {
        ChildId = childId;
        if (childId != null)
        {
            _lazyChild = new Lazy<MyContainedClass>(() => child);
            //Without the below line, later accessing _lazyAnswerGroup will throw:
            //System.MissingMemberException: 'The lazily-initialized type does not have a public, parameterless constructor.'
            var _ = _lazyChild.Value;
        }
        else
        {
            _lazyChild = new Lazy<MyContainedClass>(() => ChildId.HasValue ? repo.Get(ChildId.Value) : null);
        };
    }

    public int? ChildId { get; set; }

    public MyContainedClass Child => _lazyChild.Value;
}

旁注 - 是的,我知道您传入子元素然后更改 ChildId 时存在错误。我假设那是无关的。

我想我已经明白了。 我们还调用了一个方法,该方法使用反射在内存中创建对象的 deep-copy。 显然,这不会调用 non-parameterless 构造函数,因此 Lazy<> 没有被正确初始化。