2

public IList GetClientsByListofID(IList ids) ここで、T : IClient { IList クライアント = 新しい List(); client.Add(新しいクライアント(3)); }

ここでコンパイラ エラーが発生します。

「Bailey.Objects.Client」から「T」に変換できません

クライアント オブジェクトは IClient インターフェイスを実装します。ここでの私の目標は、クラス間の結合を緩めることです (DI の学習 atm)。あらゆるタイプのクライアントオブジェクトを使用でき、それが返されると言えると考えていました。

私はここで完全に基地から外れていますか?

ありがとう

ジョン・ホーキンス

4

5 に答える 5

5

このように一般的な制約を使用することはできません。コンパイラは、インターフェイスClientを実装しているという理由だけで、型パラメーターが a であることをどのように保証できますか? IClient多くの型がそのインターフェースを実装できませんでしたか?

この場合 (つまり、インターフェイスではなく型を操作する必要がある場合)、次のように型自体で型パラメーターを制約することをお勧めします。

public IList<T> GetClientsByListofID<T>(IList<int> ids) where T : Client
{
    IList<T> clients = new List<T>();
    clients.Add(new Client(3));
    // ...
}

そしてそれをしたら、ジェネリックメソッドがまったく必要かどうか疑問に思っています:

public IList<Client> GetClientsByListofID(IList<int> ids)
{
    IList<Client> clients = new List<Client>();
    clients.Add(new Client(3));
    // ...
}
于 2009-04-14T13:32:02.517 に答える
1

ClientですIClientTですIClient

であるとどこで指定しTましたClientか? どこにも!

IClient インスタンスを作成/取得するIClientFactoryorが必要だと思います。IClientRepositoryその後、このファクトリー/リポジトリーのさまざまな実装を使用できるようになります。

于 2009-04-14T13:36:27.937 に答える
1

これを試して:

public interface IClient
{
    string Name { get; }
}

public class Client : IClient
{
    public string Name { get; set; }
}

     ...

public IList<T> GetClientsByListofID<T>( IList<int> ids )
         where T : class, IClient
{
    var clients = new List<T>();
    var client = new Client { Name = "bob" } as T;

    clients.Add( client );

    return clients;
}

使用法:

     var clients = this.GetClientsByListOfID<Client>( null );
于 2009-04-14T13:55:54.130 に答える
1

あなたの問題は制約にありません

where T : IClient

むしろあなたのリストの使用において。

あなたはこれを言うことはできません:

IList<T> clients = new List<T>();
clients.Add( new Client(3));

これを言うことができます:(これは、制約に「新しい」が含まれていることを前提としています)

IList<T> clients = new List<T>();
clients.Add( new T());

この場合、制約は次のようにする必要があります。

    where T : new(), IClient

または、これを行うこともできますが、ジェネリックはまったく使用されません。

IList<T> clients = new List<Client>();
clients.Add( new Client(3));

やろうとしていることを実行できない理由は、コンパイラが T 型が Client 型になることを保証できないためです。そのため、コンパイラ エラーが発生します。それは実際にはあなたの制約とは何の関係もありません。

于 2009-04-14T14:10:21.333 に答える
0

C# 3.0 ではジェネリックが共分散をサポートしていないため、あなたがしていることは機能しません。

次のようなことができます。

    interface IClient
    {
        int Id { get; set; }
    }

    class Client : IClient
    {
        public int Id { get; set; }
        public Client() { }
    }

    // ...

    public IList<T> GetClientsByListofID<T>(IList<int> ids) where T : IClient, new()
    {
        IList<T> clients = new List<T>();
        clients.Add(new T() { Id = 3 });
        // ...
        return clients;
    }

...しかし、ジェネリックがまったく必要かどうか疑問に思います。

于 2009-04-14T14:00:33.917 に答える