8

次の封印されたクラスがあります。リストを として返そうとしていReadOnlyCollectionます。いくつかのことを試しましたが、私はこれのこつを得ていません。では、リストを読み取り専用コレクションに返す、またはキャストするにはどうすればよいでしょうか。

    public sealed class UserValues
    {
        private readonly List<UserValue> _Values = new List<UserValue>();

        public ReadOnlyCollection<UserValues> Values
        {
            get
            {
                return _Values;
            }
        }
    }
4

3 に答える 3

4

試す:

return new ReadOnlyCollection<UserValue>(_Values);

編集:

あなたがジョンに言ったことを考えると、あなたのコードは意味がありません。getのタイプを参照してList<UserValue>いますが、それを のタイプに変換したいのですが、これはできません。これはReadOnlyCollection<UserValues>、2 つの異なるタイプの 2 つのコレクションです。

この質問に答えるには、さらに情報が必要です。クラスが型のコレクションまたは型UserValuesのコレクションを返すようにしたいですか? あなたのコードは を暗示していますが、あなたのコメントの状態はです。あなたの上司がタイプミスをしていないことを確信していますか?UserValuesUserValueUserValueUserValues

そうでない場合は、次のような内部コレクションが必要になります。

private readonly List<UserValues> _MoreValues = new List<UserValues>();

そして、私(または回答した​​他の人-与えられたすべての回答はListをReadOnlyCollectionに変換するのに有効です)が示した構文でそれを返します。

タイプが互換性があると仮定して、私のコードは .Net 3.5 を対象としてコンパイルされることに注意してください (つまり、 ReadOnlyCollection<UserValue>wraps List<UserValue>、または両方がUserValues)。

于 2013-05-05T20:22:21.667 に答える
4

List<UserValue>aはaではなくReadOnlyCollection<UserValue>、暗黙的にそれに変換できないため、コンパイル時エラーが発生しています。ReadOnlyCollection<UserValue>(ちなみにという意味ではなかったと思いますReadOnlyCollection<UserValues>か?)

おそらく最も簡単に使用List<T>.AsReadOnlyできますが、一度だけ作成することもできます。

public sealed class UserValues
{
    private readonly List<UserValue> values = new List<UserValue>();
    private readonly ReadOnlyCollection<UserValue> valuesView;

    public UserValues()
    {
        valuesView = values.AsReadOnly();
    }

    public ReadOnlyCollection<UserValues> Values { get { return valuesView; } }
}

ReadOnlyCollection<T>実際には単なるビューです。そのため、基になるコレクションへの変更はビューを通じて表示されます。

于 2013-05-05T20:25:06.020 に答える
2

_Valuesは aList<UserValue>であり、a ではありませんReadOnlyCollection<UserValue>(コンパイラーが知る限り、それらは関連していません)。そのため、_Values直接返すことはできません。ReadOnlyCollection<T>次のように、リストから を作成して返すことができます。

private List<UserValue> _Values = [whatever];
private ReadOnlyCollection<UserValue> _ValuesWrapper;

public UserValues()
{
  _ValuesWrapper = _Values.AsReadOnly();
}

public ReadOnlyCollection<UserValue> Values
{
  get { return _ValuesWrapper; }
}

...または、コレクションにアクセスするための読み取り専用の方法を探しているだけで、特にオブジェクトが必要ない場合はReadOnlyCollection<UserValue>、プロパティを変更して、実装する読み取り専用インターフェイスを返すことList<T>ができ、アプリケーションで使用できますその代わりに。.NET 4.5 では、この種の作業に最適な読み取り専用のコレクション インターフェイスがいくつか導入されました。

public IReadOnlyList<UserValue> Values
{
  get { return _Values; }
}
于 2013-05-05T20:25:39.493 に答える