我正在尝试清理我的代码以初始化静态只读变量。
原件:
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}}?
答案 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()
更具可读性