【问题标题】:How does Lazy<T> get around needing new() constraint?Lazy<T> 如何绕过需要 new() 约束?
【发布时间】:2011-12-29 03:21:27
【问题描述】:

示例 1(未编译):

void Main()
{
    var c = new C<D>();
    c.M.F();
}

class C<T>
{
    T _m = null;
    public T M { get {
        if(_m == null) _m = new T();
        return _m; 
    } }
}

class D
{
    public void F() { Console.WriteLine ("i was created"); }
}

结果:

无法创建变量类型“T”的实例,因为它没有 new() 约束

示例 2(工作):

void Main()
{
    var c = new C<D>();
    c.M.F();
}

class C<T>
{
    Lazy<T> _m = new Lazy<T>();
    public T M { get { return _m.Value; } }
}

class D
{
    public void F() { Console.WriteLine ("i was created"); }
}

结果:

i was created

【问题讨论】:

    标签: c# templates lazy-evaluation


    【解决方案1】:

    如果你深入研究源代码,你会发现Lazy&lt;T&gt; 最终使用Activator

    return new Lazy<T>.Boxed((T)Activator.CreateInstance(typeof(T)));
    

    这只是使用反射的捷径。由于它不是通过实际的泛型类型参数 (new T()) 来实例化类型,而是通过反射调用构造函数,因此不需要 where T : new() 约束。

    【讨论】:

      猜你喜欢
      • 2014-04-01
      • 1970-01-01
      • 2021-06-08
      • 2021-02-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-09
      • 1970-01-01
      相关资源
      最近更新 更多