質問

ここで問題があります。私は、構成データが含まれていますクラスを作成したいと思います。このデータは、キー/値のペアで構成されています。いくつかの例:「ホスト名」=「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メソッドからそれらを返す前に、オブジェクトをキャストすることができます。

他のヒント

C#4.0の

共変性と反変性は、インターフェイスとデリゲートに適用されます。

あなたは、インターフェイスメンバの定義で型パラメータの使い方の場所に応じて、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>ありません
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top