簡體   English   中英

如何使用委托元素初始化字典?

[英]How can I initialise a Dictionary with delegate elements?

我想創建一個 static Dictionary ,它將值映射到代表。 當使用Add這工作正常:

class MyClass {
    private delegate void _processStatement(Statement statement);

    private static Dictionary<Statement.Types, _processStatement> _statementProcessors = 
           new Dictionary<Statement.Types, _processStatement>();

    public MyClass() {
           _statementProcessors.Add(Statement.Types.Increment, Increment);
    }

    private void Increment(Statement s) {}
}

但是,我想在實例化時初始化它們,如下所示:

class MyClass {
    private delegate void _processStatement(Statement statement);

    private static Dictionary<Statement.Types, _processStatement> _statementProcessors = 
           new Dictionary<Statement.Types, _processStatement>() {
               { Statement.Types.Increment, Increment }
          }
    }
    private void Increment(Statement s) {}

}

這給了我錯誤

集合初始化程序的最佳重載 Add 方法 'Dictionary<Statement.Types, Machine._processStatement>.Add(Statement.Types, Machine._processStatement)' 有一些無效的 arguments

我不完全理解。

甚至有可能,我想要達到的目標嗎? 還是我必須在構造函數中初始化它?

在構造函數中添加它時更新我得到這個運行時錯誤:

已添加具有相同密鑰的項目。 鍵:增量

看看這段代碼:

class MyClass {
    private delegate void _processStatement(Statement statement);

    private static Dictionary<Statement.Types, _processStatement> _statementProcessors = 
           new Dictionary<Statement.Types, _processStatement>() {
               { Statement.Types.Increment, Increment }
          }
    }
    private void Increment(Statement s) {}
}

您想制作 Dictionary static,但IncrementMyClass的實例方法。 想一想——這將如何運作? 為了調用Increment ,需要實例化MyClass ,但您希望在此之前訪問它。

你的第一個例子是正確的......

或者,您可以Increment static:

class MyClass {
    private delegate void _processStatement(Statement statement);

    private static Dictionary<Statement.Types, _processStatement> _statementProcessors = 
           new Dictionary<Statement.Types, _processStatement>() {
               { Statement.Types.Increment, Increment }
          }
    }
    private static void Increment(Statement s) {}

}

或者,您可以實例化MyClass並引用該方法:

class MyClass
{
    private delegate void _processStatement(Statement statement);

    private static Dictionary<Statement.Types, _processStatement> _statementProcessors;

    static MyClass()
    {
        var myClass = new MyClass();
        _statementProcessors = new Dictionary<Statement.Types, _processStatement>
        {
            { Statement.Types.Increment, myClass.Increment }
        };
    }

    private void Increment(Statement s) { }
}

或者,您可以創建MyClass的 static 實例:

class MyClass
{
    private delegate void _processStatement(Statement statement);

    private static MyClass Instance { get; } = new MyClass();
    private static Dictionary<Statement.Types, _processStatement> _statementProcessors = new Dictionary<Statement.Types, _processStatement>
    {
        { Statement.Types.Increment, Instance.Increment }
    };

    private void Increment(Statement s) { }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM