ilist 메소드 () 여기서 t : iclient는 클라이언트 객체를 추가 할 수 없습니다.
-
09-09-2019 - |
문제
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;
}
...하지만 제네릭이 필요한지 궁금합니다.