I’m unclear as to why the following code snippet isn’t covarient?
public interface IResourceColl<out T> : IEnumerable<T> where T : IResource {
int Count { get; }
T this[int index] { get; }
bool TryGetValue( string SUID, out T obj ); // Error here?
}
Error 1 Invalid variance: The type parameter ‘T’ must be invariantly
valid on ‘IResourceColl.TryGetValue(string, out T)’. ‘T’ is
covariant.
My interface only uses the template parameter in output positions. I could easily refactor this code to something like
public interface IResourceColl<out T> : IEnumerable<T> where T : class, IResource {
int Count { get; }
T this[int index] { get; }
T TryGetValue( string SUID ); // return null if not found
}
but I’m trying to understand if my original code actually violates covariance or if this is a compiler or .NET limitation of covariance.
The problem is indeed here:
You marked obj as
outparameter, that still means though that you are passing inobjso it cannot be covariant, since you both pass in an instance of typeTas well as return it.Edit:
Eric Lippert says it better than anyone I refer to his answer to “ref and out parameters in C# and cannot be marked as variant” and quote him in regards to
outparameters: