gpt4 book ai didi

c# - Lazy 如何解决需要 new() 约束的问题?

转载 作者:可可西里 更新时间:2023-11-01 07:55:51 25 4
gpt4 key购买 nike

示例 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"); }
}

结果:

Cannot create an instance of the variable type 'T' because it does not have the new() constraint

示例 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

最佳答案

如果深入研究源代码,您会看到 Lazy<T>最终使用 Activator :

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

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

关于c# - Lazy<T> 如何解决需要 new() 约束的问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8130290/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com