Caliburn Micro从1.4更新到1.5->;IoC.Get<>;不适用于Lazy<>;不再

本文关键字:gt lt 不适用 Get 适用于 不再 Lazy IoC 更新 Caliburn Micro | 更新日期: 2023-09-27 18:21:18

我有现成的代码,可以很好地编译Caliburn Micro 1.4:

private static readonly Lazy<IShell> shellLazy = new Lazy<IShell>(IoC.Get<IShell>, true);

我删除了1.4版本,并通过NuGet安装了1.5版本,在没有更改任何内容的情况下,这一行现在抛出了一个错误:

错误1"System.Lazy.Lazy(System.Func,System.Threading.LazyThreadSafetyMode)"的最佳重载方法匹配包含一些无效参数C:''Users''User''Documents''Visual Studio 2012''Projects''Arnova''Src''CShellCore''Shell.cs 35 58 CShellCore

我发现消除此错误的唯一方法是避免使用Lazy<>完全:

private static readonly IShell shellLazy = IoC.Get<IShell>();

我已经搜索了与IoC相关的任何内容。获取<>和Lazy<>以及从1.4版到1.5版可能发生了什么变化,但无法找到任何东西来解释Caliburn Micro在这些版本之间发生了什么改变,以及如何解决这一问题。

Caliburn Micro从1.4更新到1.5->;IoC.Get<>;不适用于Lazy<>;不再

我认为您的问题是IoC.Get<T>是一个返回类型为T的实例的static方法,换句话说,它不是Func<T>,因此要解决此问题,您必须修改代码,如下所示:

private static readonly Lazy<IShell> shellLazy = new Lazy<IShell>(() => IoC.Get<IShell>(), true); 

这就是编译错误的原因,即类型Lazy<>上没有接受IShell实例的构造函数。

找到了,不确定为什么需要以这种方式更改?intellisense为1.4和1.5 caliburn微型版本显示了相同的信息,这些函数看起来期望相同的参数。

到目前为止,这似乎是有效的:

private static readonly Lazy<IShell> shellLazy = new Lazy<IShell>(() => { return IoC.Get<IShell>(); }, true);