質問
ここで問題があります。私は、構成データが含まれていますクラスを作成したいと思います。このデータは、キー/値のペアで構成されています。いくつかの例:「ホスト名」=「localhost」を、「タイムアウト」= 1000、など。私の最初のアイデアは、一般的な辞書でこれらすべてを保存することでした。
private Dictionary<string, ConfigurationItem<object>> Configuration =
new Dictionary<string, ConfigurationItem<object>>();
としてConfigurationItemクラスます:
public class ConfigurationItem<T>
{
public string Name { get; set; }
public T Value { get; set; }
}
私の希望は、次のように私は設定を照会し、設定することができます。
int i = Configuration.Get<int>("Timeout");
Configuration.Set("Timeout", 1000);
残念ながら、私は次のコードを使用して構成辞書に項目を挿入することはできません
public void SetValue<T>(string key, ConfigurationItem<T> value)
{
if (Configuration.ContainsKey(key.ToUpper()))
Configuration[key.ToUpper()] = **value**;
else
Configuration.Add(key.ToUpper(), **value**);
}
太字の部分がエラーを示している。
私は固定の新しい分散機能を使用して、この問題は、これまでのところ運に望んので、タイプを変換できませんConfigurationItem
にConfigurationItem <オブジェクト>
私はC#4.0を使用しています。より多くの情報が必要な場合は、ちょうどそれに名前を付けます!あなたの助けをありがとう!
解決
あなただけのプライベート辞書<文字列、オブジェクト>としてあなたの辞書を定義し、あなたのGetメソッドからそれらを返す前に、オブジェクトをキャストすることができます。
他のヒント
共変性と反変性は、インターフェイスとデリゲートに適用されます。
あなたは、インターフェイスメンバの定義で型パラメータの使い方の場所に応じて、in
またはout
とタイプパラメータの前に付ける必要があります。
例
public interface IConfigurationItem<out T>
{
public string Name { get; set; }
public T Value { get; set; }
}
IDictionary<TKey,TValue>
は、入力と出力の両方のタイプのパラメータを使用しているため、辞書は共変または反変ではない。
C#4.0のドラフト仕様の差異の制限から、
23.3制限事項 コと反変の型パラメーターはのみのインターフェイスとデリゲート型で宣言することができます。型引数間の参照(または同一性)変換がある場合と共contravarianceにのみ適用されます。 INTからオブジェクトへの変換は、ボクシングの変換ではなく、基準変換であるためである。
例えば、IEnumerable<int>
はIEnumerable<object>
ありません