并非所有代码路径都返回类型为'Func <iunitycontainer>的lambda表达式中的值

时间:2017-02-03 06:47:40

标签: c#

为什么此代码会抛出错误:“并非所有代码路径都返回值”?

private static Lazy<IUnityContainer> container = new Lazy<IUnityContainer>(()=> 
{
    IUnityContainer container = new UnityContainer();
});

2 个答案:

答案 0 :(得分:1)

您的代码存在一些问题:

首先,您使用的Lazy<T>构造函数将Func<T>作为参数。这意味着您传递的lambda作为参数需要返回类型T的值。

编写lambda表达式时,有两种方法可以编写它。例如,返回int值的lambda可以写为简写版本:

Func<int> f = () => 0;

或者使用完整版:

Func<int> f = () => 
{
    return 0;
};

注意第二个版本如何使用return关键字,而第一个版本不使用return关键字。这是因为当使用lambda表达式的速记格式时,隐含Func

第二个问题是你误解了container作为参数的目的。它不仅仅是第一次引用Func时运行的一些代码。 new Lazy<IUnityContainer>(() => new UnityContainer()); 需要实际返回将要使用的值。

因此,在您的情况下,您需要将lambda转换为速记版本:

return

或者在匿名方法中包含new Lazy<IUnityContainer>(() => { new UnityContainer()); }); 关键字:

let store = Twitter.sharedInstance().sessionStore
        if let userID = store.session()?.userID {
            store.logOutUserID(userID)
        }

答案 1 :(得分:0)

你的lamba表达式中不需要assignemt,你只需要你的lambda返回一个新的UnityContainer对象:

private static Lazy<IUnityContainer> container = new Lazy<IUnityContainer>(() => new UnityContainer());

对于每个输入,只需返回一个新的UnityContainer对象,就可以读取以下lambda

() => new UnityContainer()

有关延迟初始化的更多信息,请查看here