我有一个问题,我不理解带有泛型的接口中的转换(可能是因为协变和逆变在目前对我来说不是很清楚)。
我定义了一个接口,其中我定义了一个getter和setter,应该以类型化的方式接受任何东西(不是对象作为类型) 例如:
public interface IDummy <T>
{
int SomeCommonMethod() ;
T Anything { get; set; }
}
现在我定义了一些之前定义的接口的具体实现。
public class MyStrObj : IDummy <string>
{
private string _stirngVal = string.Empty ;
public int SomeCommonMethod()
{
return 0 ;
}
public string Anything
{
get { return _stirngVal ; }
set { _stirngVal = value ; }
}
}
public class MyFileObj : IDummy <File>
{
private File _file = null ;
public int SomeCommonMethod()
{
return 0 ;
}
public File Anything
{
get { return _file ; }
set { _file = value ; }
}
}
有时一切都按照预期进行,但现在当我尝试使用这两个对象时,它们的行为开始变得令人困惑。
我试图定义一个对象,它应该能够消耗前两个类(不论它们在泛型中具有哪种类型,重要的是它们都是IDummy)。
public class Consumer
{
public static void Consume ( IDummy<object> obj )
{
//SOME CODE HERE.
}
}
现在如果我尝试这段代码:
MyStrObj obj = new MyStrObj () ;
Consumer.Consume ( obj ) ;
编译器提示我在调用Consume方法时有一些无效参数(obj确定),但这里没有隐式转换?
如果我尝试这种方式:
MyStrObj obj = new MyStrObj () ;
Consumer.Consume ( (IDummy<object>)obj ) ;
编译器看起来按照我预期的方式工作(此时我还没有测试这两个调用是否等效)。
感谢任何可以帮助我理解这种行为的人,并对我的英语表示歉意(这不是我的母语)。