我有一个我不了解使用泛型接口进行转换的问题(可能是因为目前我对协方差和反方差还不太清楚)。
我有一个接口,在其中定义了一个getter和setter,该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 ) ;
编译器似乎按我的预期工作(当时我还没有测试两个调用是否等效)。
预先感谢任何可以帮助我理解这种行为的人,并为我的英语(不是我的语言)感到抱歉。
您IDummy<T>
不是协变的。这就是为什么这样的隐式转换不起作用的原因。如果是协变的,则可以从更具体的泛型转换为更通用的泛型。但是,在您的示例中,您无法使接口协变IDummy<out T>
,因为它具有带有通用参数的属性设置器。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句