0

いくつかの特定の値の出現回数を集計するために、私は を使用してdictionary<valueName:string, counter:int>いますが、値が正確にはわかりません。だから私はメソッドを書いたがSetOrIncrement、それはおそらく次のように使われる

myDictionary.SetOrIncrement(name, 1);

ただし、VisualStudio が不平を言うことがあります。

「辞書には 'SetOrIncrement' の定義が含まれておらず、タイプ 'Dictionary の最初の引数を受け入れる拡張メソッド 'SetOrIncrement' が見つかりませんでした。」

理由は何ですか?

SetAndIncrementメソッドは次のとおりです。

public static class ExtensionMethods
{
    public static int SetOrIncrement<TKey, int>(this Dictionary<TKey, int> dict, TKey key, int set) {
        int value;
        if (!dict.TryGetValue(key, out value)) {
           dict.Add(key, set);
           return set;
        }
        dict[key] = ++value;
        return value;
    }
}
4

2 に答える 2

1

これを試して:

void Main()
{
    var dict = new Dictionary<string, int>();
    dict.SetOrIncrement("qwe", 1);
}

// Define other methods and classes here
public static class ExtensionMethods
{
    public static int SetOrIncrement<TKey>(this Dictionary<TKey, int> dict, TKey key, int set)
    {
        int value;
        if (!dict.TryGetValue(key, out value)) {
           dict.Add(key, set);
           return set;
        }
        dict[key] = ++value;
        return value;
    }
}
于 2013-08-02T12:07:39.683 に答える
1

拡張メソッドは正しくコンパイルされますか? コンパイルしようとすると、「型パラメーターの宣言は型ではなく識別子でなければなりません」というメッセージが表示されます。

その理由は、次の行にあります。

public static int SetOrIncrement<TKey, int>(this Dictionary<TKey, int> dict, TKey key, int set) {

メソッドのintジェネリック パラメータの が無効です。代わりに、これはうまくいくはずです:

public static int SetOrIncrement<TKey>(this Dictionary<TKey, int> dict, TKey key, int set) {

その理由TKeyは、変化する唯一のタイプだからです。int は常に同じであるため、ジェネリック パラメータではありません。

于 2013-08-02T12:08:33.047 に答える