5

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

原来的:

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()方法中获取代码并将其放在匿名委托中以返回要分配的列表,但它说我正在尝试将 adelegate转换为List<int>?

4

7 回答 7

6

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

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

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

于 2012-11-26T17:53:48.017 回答
4

原因是当你写

() =>
   {
       ...

       return list;
   };

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

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

于 2012-11-26T17:50:52.400 回答
2

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

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

为此,C# 中的语法非常有问题,因此最好使用单独的调用或方法。

于 2012-11-26T18:02:30.843 回答
2

它说我正在尝试将委托转换为List<int>

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

Func<List<int>> createList = () => { ... return list; };
MyList = createList();
于 2012-11-26T17:51:57.333 回答
1

你忘记了括号。用这个 :

public static readonly List<int> MyList = (() =>
{
    ...
    return list;
});
于 2015-02-08T21:30:45.443 回答
1

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

于 2012-11-26T17:50:48.050 回答
0

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

于 2012-11-26T18:11:33.823 回答