2013-05-05 4 views
5

次の密閉クラスがあります。私はReadOnlyCollectionとしてリストを返そうとしています。いくつかのことを試してみましたが、私はこれをやっていません。だから私はどのように返すか、リストをreadonlyコレクションにキャストしますか?エラーが発生する理由:「System.Collections.Generic.List型を暗黙的に変換できません」

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

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

クラス 'リストをは' 'その基底クラスとしてobject'ました。 'ReadOnlyCollection 'クラスは、したがって、基本クラスではなく、暗黙の演算子が定義されていないことから、あなただけのようなこの2つのクラスの間で変換することはできません。新しい 'ReadOnlyCollection <>'を作成したい場合は、 '_Values.AsReadOnly()'を使います。最新の.NETバージョン(4.5、VS2012)を使用する場合は、プロパティタイプをインタフェース 'IReadOnlyList 'に変更することができます。 'List <>'は 'IReadOnlyList <>'を実装しているので、キャストは必要ありません。安全ではありません(あなたのクラスの消費者を信頼しない場合)。ずっとあなたが、彼らは本当に、本当にしたい場合は、あなたのクラスの内臓をいじって誰かを停止するために行うことができますがありません - –

+0

Aは、消費者が '' ReadOnlyCollection は 'もかかわらによってラップ' IListので取得するためにリフレクションを使用することができます決定しました。私は、もし彼らが*物を壊そうと決心すれば、彼らは道を見つけるだろう、だからあまり心配する価値はない。 –

+0

Jeppeが述べたように_Values.AsReadOnly()を実行しようとしたところ、まったく同じコンパイラエラーが発生しました。そして私はvs2008だけを使用しているので、彼が言及したインターフェースにアクセスすることはできません。おそらく理想的ではありません - 'ReadOnlyCollection 'ラッパープロパティにアクセスするたびに新しいインスタンスを作成します – Debbie

答えて

4

試してみてください。

return new ReadOnlyCollection<UserValue>(_Values); 

編集:あなたはジョンに言ってきたもの

を考えると、あなたのコードは意味がありません。 getList<UserValue>のタイプを参照していますが、タイプをReadOnlyCollection<UserValues>に変換したい場合は、2つのタイプの2つのコレクションです。

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

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

をそして私(または他の人が答えている構文で、それを返す - 指定したすべての答えを変換するための有効です。

ない場合は、そのようないくつかの内部コレクションをする必要がありますReadOnlyCollectionへのリスト)が表示されています。私のコードは、型に互換性(ReadOnlyCollection<UserValue>ラップList<UserValue>を意味する、またはその両方がUserValuesある)であることを前提とし、.NET 3.5をターゲットにコンパイル

注意。

+0

。 –

+0

「理想的」ではないことは事実ですが、この場合は質問に答えて質問者になります。他の人が示唆しているとして、あなたは.AsReadOnlyを行うことができますが、あなたはそれを逆コンパイル場合は、それは、これがないことがわかります。新しいReadOnlyCollection ((IListの)これを)返す;. "ベスト"の解決法(人のニーズに応じて)は、読み取り専用のコレクションを保持しているメンバーを作成することですが、それはキャスティングの問題だった質問の範囲を超えているようです。 – Gjeltema

+0

私はちょうど上記のコードを試す時間があったし、どちらもコンパイルされません。 – Debbie

3

List<UserValue>ReadOnlyCollection<UserValue>ではなく、またそれはそれに暗黙的に変換されるので、あなたは、コンパイル時エラーを取得しています。それはList<T>.AsReadOnlyを使用するために、おそらく最も簡単なのです

(?私は、あなたが道でReadOnlyCollection<UserValue>の代わりReadOnlyCollection<UserValues>を意味仮定) - しかし、あなたは同様に一度だけ、それを作成することができます:

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>は本当にただ眺めています - 基礎となるコレクションへの変更がビューを通して表示されます。

+0

こんにちはジョン。いいえ、私は本当に "UserValues"を意味していました。私の上司がコードスタブを私に渡したので、メソッドシグニチャを変更せずにコードスタブを埋めなければなりません。変数にマッチするようにシグネチャを変更することができれば、これは非常に簡単です。 – Debbie

+0

@Debbie:あなたが質問に書いたコードはまったく意味がありません。タイプミスではないと確信していますか?あなたの上司に相談することをお勧めします。 'UserValues'クラスが' UserValue'オブジェクトのコレクションを持つことは意味がありますが、 'UserValues'オブジェクトのコレクションを持つことはできません。 –

2

_ValuesReadOnlyCollection<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; } 
} 
+0

悲しいことに、私は.net 4.5へのアクセス権がありません。私のVisualスタジオは2008年です。ここまでは、私が持っているVisual Studioのバージョンでは何も言及しません。誰でも "。dumb down"の回答を.net 4.5から.net 3.5にしてもよろしいですか? – Debbie

+0

私のコードは、.Net 3.5のターゲティングをコンパイルします。また、ジェレミーとジョンが推奨していることを.AsReadOnly()は.NET 2.0からサポートされているので、彼らはあまりにもコンパイルします(http://msdn.microsoft.com/en-us/library/e78dcd75(v=vs.90 ).aspx)。問題は 'UserValues'コレクションクラスをラップする' UserValues'読み取り専用コレクションの必要性にあります。私があなたの質問に答えるのを助けるために、私の答えに記したように、より多くの情報を提供してください。 – Gjeltema

関連する問題