2011-01-04 8 views
0

すべてのことを考えると、私はジェネリックスが初めてです。C#のジェネリックスに問題がある

namespace YvanSoftware_V5.Models 
{ 
    public interface ISession : IDisposable 
    { 
     void CommitChanges(); 
     Db4objects.Db4o.IObjectContainer Container { get; } 
     void Delete(System.Linq.Expressions.Expression<Func< T, bool>> expression); 
     void Delete(object item); 
     void DeleteAll(); 
     void Dispose(); 
     T Single(System.Linq.Expressions.Expression<Func< T, bool>> expression); 
     System.Linq.IQueryable All(); 
     void Save(T item); 
    } 
} 

私は次のコンパイルエラーが発生しますが、この文脈でどのような意味があるのか​​分かりません。

型または名前空間名「T」が見つかりませんでした(あなたがusingディレクティブまたはアセンブリ参照が不足している?)

私はhttp://www.itslet.nl/?p=125から、このコードを得ました。

は、あなたがこのような一般的な機能のテンプレートパラメータとしてTを指定する必要が

+0

私は、Tジェネリック型を取るメソッドはここでは一般的である必要があると考えています。 'void Delete (... Func < T, bool> ...)'ですが、実際にはそのページの作者に尋ねるべきです。 –

答えて

9

Tが定義されていないためです。コンパイラは存在しないTという名前の型を検索しようとします。あなたは全体のインターフェイスは、一般的なことをしたくない場合は、あなたのように、各メソッドに追加することができます

public interface ISession<T> : IDisposable 

実際に
Save<T>(T item) 

、それはどのような著者のにあなたのインターフェース署名を変更してみてくださいこのコードでは、提供したリンクの実装クラスDb4oSessionを見てください。正しいインタフェース定義は次のようになります。

public interface ISession : IDisposable 
{ 
    void CommitChanges(); 
    Db4objects.Db4o.IObjectContainer Container { get; } 
    void Delete<T>(System.Linq.Expressions.Expression<Func< T, bool>> expression); 
    void Delete(object item); 
    void DeleteAll(); 
    void Dispose(); 
    T Single<T>(System.Linq.Expressions.Expression<Func< T, bool>> expression); 
    System.Linq.IQueryable All(); 
    void Save<T>(T item); 
} 
0

イヴァン、あなたの助けをありがとう:

void Save<T>(T item); 

私は、より単純なもので始まります最初のジェネリック薬の使用。

0

あなたがインターフェイスまたはメソッドのいずれかの型パラメータTを定義する必要があります。

public interface ISession<T> : IDisposable 

または

void Delete<T>(System.Linq.Expressions.Expression<Func< T, bool>> expression) 
T Single<T>(System.Linq.Expressions.Expression<Func< T, bool>> expression); 
void Save<T>(T item); 
0

まあ、私はItsletのarticleの作家。私は記事のコードを改善しました。シンタックスハイライトが私の<T>を削除したようです。 通知ありがとうございます。