如何使用interface作为通用参数?

ivy*_*ike 0 .net c# generics inheritance

我有一个通用类:

class JobDetails<IJobRequirement>{}
class SpecialRequirement: IJobRequirement{}
Run Code Online (Sandbox Code Playgroud)

我无法将类型的值赋给类型JobDetails<SpecialRequirement>的变量JobDetails<IJobRequirement>.这在C#中是可能的还是我遗漏了一些基本的东西?

Tox*_*ron 5

一般而言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)

但是,使用修饰符inout限制是否可以将类型用作返回值方法参数.

这就是为什么你的分配的理由IEnumerable<B>IEnumerable<A>,如果public class B : A因为IEnumerable被声明为IEnumerable<out T>.

有关详细信息,我建议您阅读以下博客:http://tomasp.net/blog/variance-explained.aspx/

  • @ivymike,检查一下:https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/concepts/covariance-contravariance/creating-variant-generic-interfaces (2认同)