C# 为什么我不能转换Foo<;酒吧>;到IFoo<;IBar>;
为什么我不能将C# 为什么我不能转换Foo<;酒吧>;到IFoo<;IBar>;,c#,.net,C#,.net,为什么我不能将Foo转换为IFoo 如果我尝试,我会得到: 从Foo到IFoo 如果您使用C#4并且IFoo声明为: public interface IFoo<out T> 这在t中不能是协变的,否则您可以写: public class StringFoo : IFoo<string> { public T Value { get; set; } } IFoo<string> fooString = new StringFoo(); // Tha
Foo
转换为IFoo
如果我尝试,我会得到:
从Foo
到IFoo
如果您使用C#4并且
IFoo
声明为:
public interface IFoo<out T>
这在t中不能是协变的,否则您可以写:
public class StringFoo : IFoo<string>
{
public T Value { get; set; }
}
IFoo<string> fooString = new StringFoo(); // That's fine
IFoo<object> fooObject = fooString; // This isn't, because...
fooObject.Value = new Object(); // ... this would violate type safety
公共类StringFoo:IFoo
{
公共T值{get;set;}
}
IFoo fooString=new StringFoo();//那很好
IFoo foooobject=fooString;//这不是,因为。。。
fooObject.Value=新对象();/。。。这将违反类型安全
阅读Eric Lippert的文章,了解更多信息。这取决于编译时使用的C语言版本
C#和.NET 4引入了通用协方差和逆变:为了使这一点起作用,需要做到三件事:
Bar
必须实现IBar
Foo
必须实现IFoo
IFoo
在T
中必须是协变的(如下所示:IFoo
)Foo是否实现IFoo?是否实现
Foo
IFoo和Bar
实现IBar
?显示:(1)您对Foo的定义,特别是它实现的接口。(2) 您在尝试“转换”时使用的代码。当然,Foo是否实现ifoo该问题通过向接口声明中添加out来解决。谢谢
public class StringFoo : IFoo<string>
{
public T Value { get; set; }
}
IFoo<string> fooString = new StringFoo(); // That's fine
IFoo<object> fooObject = fooString; // This isn't, because...
fooObject.Value = new Object(); // ... this would violate type safety