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