ilist 메소드 () 여기서 t : iclient는 클라이언트 객체를 추가 할 수 없습니다.

StackOverflow https://stackoverflow.com/questions/747576

문제

public ilist getClientsByListOfid (ilist ids) 여기서 t : iclient {ilist clients = new list (); clients.add (새 클라이언트 (3)); }

여기에서 컴파일러 오류가 발생합니다.

'bailey.objects.client'에서 't'로 변환 할 수 없습니다.

클라이언트 객체는 iclient 인터페이스를 구현합니다. 여기서 내 목표는 내 수업 (학습 di atm atm) 사이의 커플 링을 시도하고 느슨하게하는 것입니다. 나는 그것이 어떤 유형의 클라이언트 객체를 사용할 수 있다고 말할 수 있다고 생각하고 있었고 그것이 반환 될 것이라고 생각했다.

내가 여기에 완전히 벗어난가?

감사

존 호킨스

도움이 되었습니까?

해결책

이런 식으로 일반적인 제약을 사용할 수 없습니다. 컴파일러가 유형 매개 변수가 Client 단순히 그것을 구현하기 때문입니다 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));
    // ...
}

다른 팁

Client a IClient. T a IClient.

당신은 그것을 어디에 지정 했습니까? T a Client? 아무데도!

나는 당신이 필요하다고 생각합니다 IClientFactory 또는 IClientRepository 그것은 당신을 위해 iClient 인스턴스를 만들/검색합니다. 그런 다음이 공장/저장소의 다른 구현을 사용할 수 있습니다.

이 시도:

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 );

당신의 문제는 제약이 아닙니다

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가 유형 클라이언트가 될 것이라고 gaurantee 할 수 없기 때문에 컴파일러 오류를 제공하는 이유입니다. 그것은 당신의 제약과 실제로 관련이 없습니다.

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;
    }

...하지만 제네릭이 필요한지 궁금합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top