c# - 为什么我不能将 Foo<Bar> 转换为 IFoo<IBar>

标签 c# .net

为什么我不能转换 Foo<Bar>IFoo<IBar> .

如果我尝试我得到:

There is no implicit reference conversion from Foo<Bar> to IFoo<IBar>

最佳答案

如果您使用 C# 4 和 IFoo,它会起作用被声明为:

public interface IFoo<out T>

假设Bar工具 IBarFoo<T>工具 IFoo<T> .

但是,只有在安全的情况下才能这样声明。如果 T安全值“进入”API 以及出来。例如:

public interface IFoo<T>
{
    T Value { get; set; }
}

不能在 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

阅读 Eric Lippert 的 long blog series on generic variance了解更多信息。

关于c# - 为什么我不能将 Foo<Bar> 转换为 IFoo<IBar>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7444166/

相关文章:

c# - 在没有函数或类语法的情况下使用 C# 括号

javascript - 如何获取 DropDownList 选定值并将其发送到 ASP.NET MVC 4 中的 Controller 并使用 JavaScript?

c# - 如何在 C#/.NET 中从一个位图中减去另一个位图?

c# - 如何在richtextbox中使用多色

.net - .NET 的简单事件总线

c# - Entity Framework 6 : Creating database with multiple contexts

c# - WPF DataGrid - 在行选择/失去焦点时防止颜色变化

c# - 以线程安全的方式使用增量编号更新文件

.net - 我可以将 .NET 项目移植到 .NET Core 并使用 .NET 4.0 中的 DLL 依赖项吗?

asp.net - basicHttpBinding 的 WCF 服务配置