2011-01-06 3 views
0

次の宣言は、エラーが発生します。なぜ静的フィールドを初期化すると恐ろしいランタイムが発生するのですか? "あいまい一致が見つかりました"?

private static IDictionary<int, string> Dic = new Dictionary<int, string>(); 

次がいない間:

private static IDictionary<int, string> Dic; 

何...?私は静的なコンストラクタで辞書を初期化することができますが、私が実際に使用したいのはリテラル初期化子(同じ問題)です。

を編集します。問題は静的コンストラクタに関連しているようです。静的なコンストラクタを宣言すると、同じエラーが発生します。疑いなくフィールドを初期化することによって、コンパイラはデフォルトの静的コンストラクタを生成します。私たちのアプリの一部は、リフレクションを使用してインスタンス化するクラスを選択しています。静的なコンストラクタメソッドで混乱している可能性があります。

実際、スタティックフィールド(static int i = 0;)にイニシャライザを追加して同じ結果を得ることができます。これは実際に私たちのアプリ全体のアーキテクチャと関係があります。私はこれと別の方法を行っています。すべてのあなたのご意見ありがとうございます。

+0

私はそれが私が持っているすべての参照と関係があると確信しています。それは大きなプロジェクトに入っています。 – Ishmael

+0

'Dictionary <,>'型( 'System.Collections.Generic'以外のもの)を含む名前空間をインポートしましたか? – Ani

+0

http://weblogs.asp.net/pjohnson/archive/2006/08/11/Ambiguous-match-found.aspxとhttp://dotnetdebug.ne​​t/2006/03/21/ambiguous-match-foundを参照してください。 -in-a-web-control-a-possible-bug/ –

答えて

0

。バインディングフラグには、静的コンストラクタの検索を有効にするフラグが含まれていました。このフラグを削除するとエラーが解消されました。私がこの質問で述べたように、静的なフィールドを初期化すると、コンパイラは静的なconstrutorを生成します。

1

あいまいな参照の場合は、その名前を持つusing名前空間内に複数の型があるためです。そのため、コンパイラはあなたが参照しているものを知りません。あなたはこのようなことが明示的に行うことができます:私たちは私たちのプレゼンテーションクラスのインスタンスを作成するためにActivator.CreateInstanceを使用していた

private static IDictionary<int, string> Dic = 
    new System.Collections.Generic.Dictionary<int, string>(); 
+0

また、より絶対的な型の識別子にするには:global :: System.Collections.Generic.Dictionary 、私は本当にそれが必要だとは思わないが。 :) – ShdNx

+0

@ShdNx:問題の型が 'SomeOtherNamespace.System.Collections.Generic.Dictionary';だった場合、それは問題を解決するに過ぎませんが –

+0

その場合、私はdevコンパイラが不平を言うと思います。これは実行時にスローされます。とにかく、助けなし。 – Ishmael

関連する問題