I'm aware that C# doesn't have generic wildcards, and that a similar effect can be achieved by generic methods, but I need to use a wildcard in a field and can't work out if there is any way to encode it.
List<State<Thing>> list;
void AddToList<T>() where T : Thing {
list.Add(new State<T>());
}
Of course, this doesn't work because the object being added isn't of type State<Thing>
, it's of type State<T> where T : Thing
. Is it possible to adjust the most internal type of the list to be the Java equivalent of ? extends Thing
rather than just Thing
?
Note that C# 4 does have additional variance support, but it does not apply in the List<T>
case, for various reasons (has both "in" and "out" methods, and is a class).
I think, however, the way to address this is with something like:
interface IState { // non-generic
object Value { get; } // or whatever `State<Thing>` needs
}
class State<T> : IState {
public T Value { get { ...} } // or whatever
object IState.Value { get { return Value; } }
}
and
List<IState> list; ...
which will then allow you to add any State<T>
. It doesn't really use much of the T
, and a cast would be needed to get from the object
to T
, but .... it will at least work.
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