1

これが問題です。構成データを含むクラスを作成したいと思います。このデータは、キーと値のペアで構成されます。いくつかの例: "hostName"="localhost"、"timeout"=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<T> を ConfigurationItem<Object> に変換できません

新しいバリアンス機能を使用してこの問題を修正したかったので、C# 4.0 を使用していますが、今のところうまくいきません。さらに情報が必要な場合は、名前を付けてください。ご協力いただきありがとうございます!

4

3 に答える 3

2

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

インターフェイス メンバーの定義での型パラメーターの使用箇所に応じて、型パラメーターの前にinまたはを付ける必要があります。out

例えば:

public interface IConfigurationItem<out T>
{
    public string Name { get; set; }
    public T Value { get; set; }
}

入力と出力に両方の型パラメーターを使用するためIDictionary<TKey,TValue>、ディクショナリは共変でも反変でもありません。

于 2009-09-27T16:59:40.217 に答える
1

C#4.0ドラフト仕様の差異の制限から

23.3制限共変型および反変型パラメーターは、インターフェースおよびデリゲート型でのみ宣言できます。共変性と反変性は、型引数間に参照(または同一性)変換がある場合にのみ適用されます。たとえば、intからobjectへの変換はボクシングの変換であり、参照の変換でIEnumerable<int>はないため、anはではありません。IEnumerable<object>

于 2009-09-27T17:17:14.763 に答える
0

辞書をprivateDictionary<string、object>として定義し、Getメソッドからオブジェクトを返す前にオブジェクトをキャストすることができます。

于 2009-09-27T17:24:59.743 に答える