Reputation: 377
I have an interface that looks like this
public interface SomeInterface<T, U>
where T : struct
where U : class
{
void Method1();
IDictionary<T, BaseClassItem<U>> GetDictionary();
}
I have one of the implementations like this
public class LruEvictor<T, U> : SomeInterface<T, U>
where T : struct
where U : class
{
private Dictionary<T, BaseClassItem<U>> _dictionary;
public void Evict()
{
}
public IDictionary<T, BaseClassItem<U>> GetDictionary()
{
_dictionary = new Dictionary<T, BaseClassItem<U>>();
return _dictionary;
}
}
In the above GetDictionary() method I would like to return a dictionary of
type Dictionary<T, DerivedItem<U>>.
Is that possible? If yes how do I do it.
Given below is the derived class implementation.
public class DerivedItem<U> : BaseClassItem<U>
where U : class
{
public DerivedItem(U value) :base(value)
{
}
public DateTime LastAccessed { get; private set; }
public override void OnAccessed()
{
LastAccessed = DateTime.Now;
}
}
Any input will be appreciated.
Thanks in advance.
Upvotes: 0
Views: 88
Reputation: 137301
I'm fairly sure you can't do this, as it would break the type system.
Consider the usual animal example:
public IDictionary<T, Animal> GetDictionary()
{
_dictionary = new Dictionary<T, Llama>();
return _dictionary; // Imagine you can do this
}
IDictionary<T, Animal> dict = GetDictionary();
dict.Add(MakeT(), new Horse()); // Ouch.
Upvotes: 2
Reputation: 10958
No, you can't do that. A simple version of your question would be that given
class Base { }
class Derived : Base { }
is it possible to use IDictionary<T, Base> dict = new Dictionary<T, Derived>()
.
This is not possible because covariance rules of C# don't allow that. And for good reason because if it would work then you could simply add an object of type Base
to the dictionary that should only accept Derived
objects.
Upvotes: 1