would this be possible? (I don't have vs. 2010, so I can't try it myself, sorry)
public interface IComplexList<out TOutput, in TInput> where TOutput : TInput
{
public IEnumerator<TOutput> GetEnumerator();
public void Add(TInput item);
}
public interface IList<T> : IComplexList<T, T>
{
}
If I get it right, you could use this to actually implement covariance and contravariance in the same interface.
Well, your question is slightly confusing because of the existing IList<T>
type. However, the following does compile:
public interface IComplexList<out TOutput, in TInput> where TOutput : TInput
{
IEnumerator<TOutput> GetEnumerator();
void Add(TInput item);
}
public interface ISimpleList<T> : IComplexList<T, T>
{
}
You can even change it to extend IEnumerable<TOutput>
:
public interface IComplexList<out TOutput, in TInput>
: IEnumerable<TOutput>
where TOutput : TInput
{
void Add(TInput item);
}
public interface ISimpleList<T> : IComplexList<T, T>
{
}
The indexer is tricky, because you'd want different types involved. You could do:
TOutput Get(int index);
void Set(int index, TInput item);
and then put the indexer into ISimpleList<T>
instead of course...
That doesn't let you use ISimpleList<T>
variantly though, because you've basically forced TInput=TOutput.
An alternative approach is to separate out the input from the output:
public interface IReadableList<out T> : IEnumerable<T>
{
T Get(int index);
}
public interface IWritableList<in T>
{
void Add(T item);
void Set(int index, T item);
}
public interface IMyList<T> : IReadableList<T>, IWritableList<T> {}
Then you could write:
public void Foo(IWritableList<string> x) { ... }
IMyList<object> objects = new MyList<object>();
Foo(objects);
and vice versa for IReadableList
. In other words, you allow variance for each side individually, but you never get variance for the two sides together.
No, you can't. In your example IList<T>
is invariant. IList<T>
would require to declare in
/out
to be covariant/contravariant. It's not possible to do that just by inheriting some interface that is covariant.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With