如何使用匿名方法初始化静态只读变量?

时间:2012-11-26 17:44:51

标签: c# static delegates anonymous-function static-members

我正在尝试清理我的代码以初始化静态只读变量。

原件:

public static readonly List<int> MyList;

//Initialize MyList in the static constructor
static MyObject() { ... }

<小时/> 我决定清理它,因为CodeAnalysis说我不应该使用静态构造函数(CA1810)。

清理:

public static readonly List<int> MyList = GetMyList();

//Returns the list
private static List<int> GetMyList() { ... }

<小时/> 我真的不喜欢这个额外的方法,所以我想我会尝试让它全部内联,但它不会起作用。我不确定我在这里做错了什么......

public static readonly List<int> MyList =
    () =>
       {
           ...

           return list;
       };

我尝试在GetMyList()方法中获取代码并将其放在匿名委托中以返回要分配的列表,但它表示我正在尝试将delegate转换为List<int> 1}}?

7 个答案:

答案 0 :(得分:4)

原因是你写的时候

() =>
   {
       ...

       return list;
   };

您实际上是在声明一个委托 - 一个返回List<int>的函数,但您实际上并没有调用该函数,因此评估为Func<List<int>>而不是List<int>

我不太确定你为什么要删除静态构造函数。静态构造函数有其用途,在某些情况下甚至可以使代码更清晰,更易读。

答案 1 :(得分:4)

这看起来有点奇怪,但试试这个:

public static readonly List<int> MyList = new Func<List<int>>(
() =>
{
    // Create your list here
    return new List<int>();
})();

诀窍是创建一个新的Func<List<int>>并调用它。

答案 2 :(得分:2)

  

它说我正在尝试将代理转换为List<int>

那是因为你是。请记住,定义lambda与调用lambda不同。你必须做更像这样的事情:

Func<List<int>> createList = () => { ... return list; };
MyList = createList();

答案 3 :(得分:2)

您应立即调用它以使其成为列表:

public static readonly List<int> MyList = new Func<List<int>>(() => {
    return new List<int>();
})(); //<-- the parentheses that invoke

C#中的语法是如此,以至于最好采用单独的调用或方法。

答案 4 :(得分:1)

它说的没错。 () => ...返回一个委托。但是你需要一个清单。因此,您必须调用此委托并获得结果。

答案 5 :(得分:1)

你忘记了括号。使用此:

public static readonly List<int> MyList = (() =>
{
    ...
    return list;
});

答案 6 :(得分:0)

正如许多人所说,普通() => { ... }会返回一个委托或表达式。我认为为列表初始化创建单独的private static方法会使代码比() => { ... }()() => { ... }.Invoke()更具可读性