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()に変換しようとしていると表示されます。delegateList<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>、実際にはその関数を呼び出していないので、これはに評価され、に評価されFunc<List<int>>ませんList<int>

ただし、静的コンストラクターを削除しようとしている理由はよくわかりません。静的コンストラクターには用途があり、場合によってはコードをよりクリーンで読みやすくします。

于 2012-11-26T17:50:52.400 に答える
2

デリゲートをに変換しようとしていると表示されますList<int>

それはあなたがそうだからです。ラムダを定義することは、ラムダを呼び出すことと同じではないことに注意してください。あなたはこのような何かをしなければならないでしょう:

Func<List<int>> createList = () => { ... return list; };
MyList = createList();
于 2012-11-26T17:51:57.333 に答える
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 に答える
1

それは正しいと言います。() => ...デリゲートを返します。しかし、リストが必要です。そのため、このデリゲートを呼び出して結果を得る必要があります。

于 2012-11-26T17:50:48.050 に答える
1

かっこを忘れました。これを使って :

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

多くの人が述べているように、plain() => { ... }はデリゲートまたは式を返します。リストの初期化のために別のメソッドを作成すると、またはprivate staticよりも少し読みやすいコードになると思います() => { ... }()() => { ... }.Invoke()

于 2012-11-26T18:11:33.823 に答える