0

KeyValuePair をシリアル化する必要がありましたが、ここで解決策を見つけました。

.NET にシリアル化可能なジェネリック キー/値ペア クラスはありますか?

だから私はその質問に対して受け入れられた答えを使用しました.必要なのはこのようなクラス/構造体を定義することだけです.

public class KeyValuePair<K,V>
{
  public K Key {get;set;}
  public V Value {get;set;}
}

これは機能しますが、同じ名前のジェネリック クラスが 2 つあります。上記のカスタム クラスとSystem.Collections.Generics名前空間のカスタム クラス。

では、このようなコードがある場合、コンパイラはどのコードを使用するかをどのように認識しますか?

myList=new List<KeyValuePair<string, string>>();

一方には署名がKeyValuePair<K,V>あり、もう一方には署名がKeyValuePair<TKey,TValue>あるため、どちらも同じ数の型パラメーターを持ちます。

コードがエラーなしでコンパイルされるのはなぜですか?

4

3 に答える 3

3

C#コンパイラは、解決する必要のある名前を検出すると、仕様の手順に従います。ルールは、セクション3.8(「名前空間またはタイプ名」)および7.6.2(「単純な名前」)にあります。

それはすべてコンテキストに関するものです。

  • 名前を参照しているタイプ
  • 名前を参照している名前空間
  • コードでのusingディレクティブ

個人的には、一般的に使用される名前空間のフレームワークにもある名前を再利用しないことをお勧めます...コードの同じセクション内から両方のタイプを参照するのが難しくなります。ただし、実際にはコンパイラに問題は発生しません。

于 2012-04-22T08:22:31.020 に答える
1

名前、名前空間、ジェネリック型パラメーターは、アセンブリごとに一意です。あなたのように別の型を作成することを妨げるものは何もありませんが、別のプロジェクトが両方のアセンブリ (システムのものとあなたのもの) を使用している場合、コンパイラはどちらを使用するかを判断できません。

バージョンの異なる 2 つの同じアセンブリが使用されている場合、同じ問題の別のバリエーションが発生します。コンパイラは、デバッグ エクスペリエンスに苦痛を与える可能性のあるアセンブリを選択してバインドします (型が一致する必要があるように見えますが、一致しません - フレームワークそれ自体は問題ありませんが)。

このような「再定義」によって別のアセンブリの型を置き換えることはできないことに注意してください。

于 2012-04-22T08:24:38.307 に答える
0

ファイル内の「using」ディレクティブを確認してください。あなたが述べたように、クラスは異なる名前空間に存在するので、クラスはそれらの1つを明示的に使用している可能性があり、これによりコンパイラーからジレンマが取り除かれます。

于 2012-04-22T08:17:50.240 に答える