我有一个名为IObSrc的接口,我有几个实现此接口的类,称为ObSrc1,ObScr2等.
Interface IObSrc
{
string id;
}
Run Code Online (Sandbox Code Playgroud)
我还有一个名为IDtSrc的接口,这个接口由一些名为DtSrc1,DtSrc2的类实现.
Interface IDtSrc
{
IObSrc getObject();
Dictionary<string,IObSrc> getObjects();
}
Run Code Online (Sandbox Code Playgroud)
当我从DtSrc1实现这个接口,并且我从DtSrc1返回ObSrc1时,没有问题,但是当我返回Dictionary<string,ObSrc1>或者Dictionary<string,ObSrc2>,我得到了typemismatch的指示.
public class DtSrc : IDtSrc
{
public Dictionary<string,IObSrc> getObjects()
{
Dictionary<string,ObSrc1> val1 = new ...'
...
return val1;
}
}
Run Code Online (Sandbox Code Playgroud)
我该如何解决这个问题.
*已编辑*
我还有一个查询,如果一个方法应该返回一个可以通过实现改变的泛型类型.
示例:
interface IDtSrc<T> where T:IObSrc
{
T ExecuteObject(string objId);
}
Run Code Online (Sandbox Code Playgroud)
这将用作
class DtSrc1
{
string ExecuteObject(string objId)
{..}
}
Run Code Online (Sandbox Code Playgroud)
和
class DtSrc2
{
Dictionary<string,string> ExecuteObject(string objId)
{..}
}
Run Code Online (Sandbox Code Playgroud)
请为此建议正确的程序.
您可以使用具有约束的泛型
interface IDtSrc<T> where T:IObSrc
{
IObSrc getObject();
Dictionary<string,T> getObjects();
}
Run Code Online (Sandbox Code Playgroud)
但是你的实现IDtSrc只能返回一种类型IObSrc.
如果声明类型字典Dictionary<string,IObSrc>,则无法以任何方式替换具有不同类型参数的字典,即使新类型参数继承自原始字体也是如此.这就是原因Dictionary<string, ObSrc1>并且Dictionary<string, ObSrc2>失败了.
您要实现的目标称为类型协方差,并且不支持它Dictionary<TKey, TValue>.只有"只读"的集合才支持类型协方差IEnumerable<T>.
这可能看起来很愚蠢,但考虑一下否则会发生什么:
Dictionary<string, IObSrc> dict = new Dictionary<string, ObSrc1>(); //illegal
dict.Add("X", new Obsrc2());
Run Code Online (Sandbox Code Playgroud)
如果这是允许的,第二行将编译正常,但在运行时爆炸.