5

ここで何かが欠けていると確信していますが、これが機能しない特定の理由はありますか?

public ObservableCollection<object> ItemCollection { get; set; }

private void SetListData<T>(List<T> MyList)
{
    ItemCollection = new ObservableCollection<object>(MyList);
}

これが機能しない T の値はありますか? オブジェクトのコレクションはすべてのケースをカバーすると思いますが、そうではないようです:

<T>エラー 2 引数 1: 'System.Collections.Generic.List 'から 'System.Collections.Generic.List <object>'に変換できません

プロパティの署名を変更すると、まったく新しい一連の問題が発生するため、次のように変更します。

ItemCollection = new ObservableCollection<T>(MyList);

良い解決策とは思えません。元のコードが機能しない理由と、簡単な修正方法があれば教えてもらえますか?

4

3 に答える 3

7

いくつかのオプションがあります。

private void SetListData<T>(List<T> MyList) where T : class

また

ItemCollection = new ObservableCollection<object>(MyList.Cast<object>());

List<T>型パラメーターが でなくても、既知の参照型の がある場合は機能する可能性がありますobject

var list = new List<string>();
var observable = new ObservableCollection<object>(list);

ただし、この場合、既知の参照型ではないジェネリック パラメーターを使用しています。値型/構造体である可能性があります。これらは s として「ボックス化」できますobjectが、本質的にobjects ではありません。

したがって、そのパラメーターが常に参照型になるように制約するか、任意の型を許可してメソッドの本体内にT明示的にキャストする必要があります。object

于 2013-06-19T13:45:09.220 に答える
1

問題は、「T」が「オブジェクト」を継承しているにもかかわらず、「T」が「オブジェクト」ではないことです。ジェネリック リストの型は同じでなければなりません。

最善の解決策は次のとおりです。

ItemCollection = new ObservableCollection<object>();
foreach(T item in MyList)
{
    ItemCollection.Add(item);
}
于 2013-06-19T13:45:03.843 に答える