Ho un'interfaccia con due parametri generici, ma uno dei parametri dovrebbe essere fornito dall'implementazione della classe.Come implementare un parametro generico che non è generico
public interface IA<T, U> { ... }
public class X<T> : IA<T, int> { ... }
public class Y<T> : IA<T, MyClass> { ... }
Tuttavia, un'altra interfaccia hanno un metodo che accetta un'istanza di IA
come parametro - tuttavia, ogni caso deve essere la stessa (stessa classe può prendere multipli X
, ma poi non sarà mai prendere una Y
, o vice versa). Ho cercato di mettere come un constrainst generica, ma poi ho qualcosa di simile
public interface IB<T, U, V> where U : IA<T, V> {
void MyMethod(U value);
}
public class Z<T> : IB<T, X<T>, int> { ... }
Naturalmente, non voglio scrivere quel parametro V
, come non riesco a scegliere un valore per esso. Il parametro U
impone già quale dovrebbe essere il valore di V! Tuttavia, non posso semplicemente rimuovere V
, perché non potrei scrivere il vincolo.
Un'altra soluzione è non utilizzare il vincolo:.
public interface IB<T> {
void MyMethod(IA<T> value);
}
Ma in questo modo, non posso garantire l'attuazione di IB
riceverà solo un'implementazione di IA
(cioè potrà per ricevere sia X
e Y
, e non dovrebbe).
C'è un modo per evitare la creazione del parametro generico V
nell'interfaccia IB
(nella prima soluzione), mentre ancora reciprocamente escludendo le implementazioni di IA
? C'è qualche ragione specifica che il compilatore non può inferire il tipo di V
e mi permetta di scrivere solo class Z<T> : IB<T, X<T>>
o questo caso non era previsto nelle specifiche della lingua/è stato scelto per non essere implementato?
L'interfaccia 'IB' dovrebbe avere gli stessi argomenti generici di' IA'. Non vedo perché è necessario passare 'X' come tipo. Hai abbastanza da definire 'MyMethod (IA valore)' che lo limiterebbe a 'X' o' Y' ma non a entrambi. –
cgTag