ivy*_*ike 0 .net c# generics inheritance
我有一个通用类:
class JobDetails<IJobRequirement>{}
class SpecialRequirement: IJobRequirement{}
Run Code Online (Sandbox Code Playgroud)
我无法将类型的值赋给类型JobDetails<SpecialRequirement>的变量JobDetails<IJobRequirement>.这在C#中是可能的还是我遗漏了一些基本的东西?
一般而言Foo<A>,Foo<B>并不共享共同的祖先.它们共享一个共同的泛型类型定义,但这并不意味着即使它们也可以赋值public class B : A.
你好像在寻找合作和逆变.C#中的泛型机制,允许您定义不同类型之间的兼容性.但是这仅适用于通用接口.
例如
public interface IJobDetails<out TRequirement>
where TRequirement : IJobRequirement
{
TRequirement Requirement { get; }
}
public class JobDetails<TRequirement> : IJobDetails<TRequirement>
{
public TRequirement Requirement { get; set; }
}
public void Test()
{
IJobDetails<IJobRequirement> a = new JobDetails<SpecificRequirement>();
}
Run Code Online (Sandbox Code Playgroud)
但是,使用修饰符in或out限制是否可以仅将类型用作返回值或方法参数.
这就是为什么你的分配的理由IEnumerable<B>来IEnumerable<A>,如果public class B : A因为IEnumerable被声明为IEnumerable<out T>.
有关详细信息,我建议您阅读以下博客:http://tomasp.net/blog/variance-explained.aspx/
| 归档时间: |
|
| 查看次数: |
89 次 |
| 最近记录: |