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

C# 如何使用匿名方法初始化静态只读变量?,c#,static,delegates,anonymous-function,static-members,C#,Static,Delegates,Anonymous Function,Static Members,我试图清理初始化静态只读变量的代码 原件: public static readonly List<int> MyList; //Initialize MyList in the static constructor static MyObject() { ... } 公共静态只读列表MyList; //在静态构造函数中初始化MyList 静态MyObject(){…} 我决定清理它,因为代码分析说我不应该使用静态构造函数(CA1810) 清理: public static

我试图清理初始化静态只读变量的代码

原件:

public static readonly List<int> MyList;

//Initialize MyList in the static constructor
static MyObject() { ... }
公共静态只读列表MyList;
//在静态构造函数中初始化MyList
静态MyObject(){…}

我决定清理它,因为代码分析说我不应该使用静态构造函数(CA1810)

清理:

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

//Returns the list
private static List<int> GetMyList() { ... }
公共静态只读列表MyList=GetMyList(); //返回列表 私有静态列表GetMyList(){…}
我真的不喜欢这个额外的方法,所以我想我应该尝试让它全部内联,但它不会工作。我不确定我做错了什么

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

           return list;
       };
公共静态只读列表MyList=
() =>
{
...
退货清单;
};

我试图在
GetMyList()
方法中获取代码并将其放置在匿名委托中以返回要分配的列表,但它表示我正在尝试将
委托
转换为
列表

它表示正确<代码>()=>…返回一个委托。但你需要一份清单。因此,您必须调用此委托并获得结果。

原因是当您编写

() =>
   {
       ...

       return list;
   };
您实际上是在声明一个委托—一个返回
List
的函数,但实际上并没有调用该函数,因此它的计算结果是
Func
,而不是
List

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

它说我正在尝试将代理转换为
列表

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

Func<List<int>> createList = () => { ... return list; };
MyList = createList();
Func createList=()=>{…返回列表;};
MyList=createList();

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

public static readonly List<int> MyList = new Func<List<int>>(
() =>
{
    // Create your list here
    return new List<int>();
})();
public静态只读列表MyList=new Func(
() =>
{
//在这里创建您的列表
返回新列表();
})();

诀窍是创建一个新的
Func
并调用它。

您应该立即调用它,使其成为一个列表:

public static readonly List<int> MyList = new Func<List<int>>(() => {
    return new List<int>();
})(); //<-- the parentheses that invoke
publicstatic只读列表MyList=newfunc(()=>{
返回新列表();

})(); // 正如许多人所说,plain
()=>{…}
返回委托或表达式。我认为为列表初始化创建一个单独的
私有静态
方法比
()=>{…}()
()=>{…}.Invoke()

您忘记了括号。使用以下命令:

public static readonly List<int> MyList = (() =>
{
    ...
    return list;
});
公共静态只读列表MyList=(()=>
{
...
退货清单;
});

+1。是的,要得到结果,需要调用函数。。。此外,我更喜欢它的单独功能。“iffe”在JavaScript中看起来更自然:)这很奇怪,也许最好用一个标准方法来保存它?@michael也许——取决于你认为什么更可读和更易于维护。这些值是常数吗?您是否可以使用公共静态只读列表MyList=newlist{1,2,3}?不,不止这些,否则内联它会非常容易。顺便说一句,您建议的替代语法(但由于可读性较差)不会编译。(我建议删除此答案。)警告:不会编译。在测试了一个不同的变体之后,在一个不同的情况下,我对它进行了升级,我确实需要一个代表,而不是一个评估。现在不能改变我的投票。