2016-08-29 3 views
-1

私はクラスタイプがDictionary<object, Func<object, TreeNode>>です。このプロパティをコンストラクタから(または式の本体を使って)幸いに設定することはできますが、プロパティのデフォルト値としては使用できません(プロパティが読み取り専用の場合やpublic get/setの場合は変更されません)。この問題は、代わりに辞書がフィールドに格納されている場合にも発生します。ディクショナリタイプのプロパティを設定するのはコンストラクタで機能しますが、デフォルトのプロパティを使用する場合は無効です

それは静的文脈に「メソッド名」は非静的メソッドにアクセスすることはできませんというエラーを思い付きます。

これが失敗したコードです:

public class TreeViewBuilder 
{ 
    public Dictionary<Type, Func<object, TreeNode>> ObjectTreeNodeBuilder { get; set; } 
     = new Dictionary<Type, Func<object, TreeNode>> 
    { 
     {typeof(Type1), t => BuildType1TreeNode((Type1) t)}, 
     {typeof(Type2), t => BuildType2TreeNode((Type2) t)}, 
    }; 

    public TreeNode BuildType1TreeNode(Type1 type1) 
    { 
     return new TreeNode { Tag = type1 }; 
    } 

    public TreeNode BuildType2TreeNode(Type2 type2) 
    { 
     return new TreeNode { Tag = type2 }; 
    } 
} 

しかし、このコードは大丈夫です:

public class TreeViewBuilder 
{ 
    public Dictionary<Type, Func<object, TreeNode>> ObjectTreeNodeBuilder { get; set; } 

    public TreeViewBuilder() 
    { 
     ObjectTreeNodeBuilder = new Dictionary<Type, Func<object, TreeNode>> 
     { 
      {typeof(Type1), t => BuildType1TreeNode((Type1) t)}, 
      {typeof(Type2), t => BuildType2TreeNode((Type2) t)}, 
     }; 
    } 

    public TreeNode BuildType1TreeNode(Type1 type1) 
    { 
     return new TreeNode { Tag = type1 }; 
    } 

    public TreeNode BuildType2TreeNode(Type2 type2) 
    { 
     return new TreeNode { Tag = type2 }; 
    } 
} 

私はTreeViewBuilderオブジェクトが完全に/インスタンス化される前にObjectTreeNodeBuilderプロパティが初期化されていることを推測していますしたがって、その方法はまだ知られていない。これは、メソッドが静的でなければならないと不平を言う理由です。これは正しいのですか、それともフードの下で何かが起こっていますか?

+0

_ "TreeViewBuilderオブジェクトが完全にインスタンス化され/構築される前にObjectTreeNodeBuilderプロパティが初期化されていると推測しています" _ - はい。より一般的には、コンストラクタが実行される前に 'this'を含むものにアクセスすることはできません。詳細については、重複したマークを参照してください。 –

+0

@PeterDunihoマークされた重複はどこで確認できますか? – Ayb4btu

+0

テキストの読み取りのすぐ下に表示されるリンクをクリックしてください。_ "この質問にはすでに回答があります:" _、あなたの質問の上部に表示されるバナーに見つかりました。 –

答えて

-1

コンパイラは、プロパティのデフォルト値を設定する静的コンストラクタを作成しています。エラーメッセージが示すように、非静的メソッドは静的コンストラクターからアクセスできません。

+1

あなたの答えを編集して、関連する修正されたコードの部分を含めることがありますか?あなたがあなたの答えに与えるより詳細な、より良いものです。 –

+0

この回答は間違っています。ここには静的なコンストラクタは含まれていません。 _staticコンテキスト_つまり、静的メンバーだけが合法であるコンテキストです。 –

関連する問題