gpt4 book ai didi

c# - C#泛型之间的类型转换有什么规则吗?

转载 作者:IT王子 更新时间:2023-10-29 04:47:47 26 4
gpt4 key购买 nike

我有一个接口(interface)IJob,所有 Job 类都从该接口(interface)继承,并且我有一个通用的 repo 类,它将处理所有类型的 IJob。

我面临的问题是我无法转换 Repository<Job1>Repository<IJob>尽管Job1IJob 的一种.

代码

internal class Program
{
public interface IJob { }
public class Job1 : IJob { }
public class Job2 : IJob { }

public class Repository<TJob>
where TJob : IJob
{
public List<TJob> GetJobs()
{
return new List<TJob>();
}
}

private static void Main(string[] args)
{
IJob iJob = new Job1(); // Valid
Repository<IJob> repo = new Repository<Job1>(); // Not Valid
}
}

谁能告诉我为什么这在 C# 中是不可能的,C# 泛型中是否有任何其他规则类型转换?

最佳答案

如果你想要协变,那么你必须为存储库引入一个通用接口(interface)并更改 GetJobs 的返回类型IEnumerable<TJob> 的方法:

internal class Program
{
public interface IJob { }
public class Job1 : IJob { }
public class Job2 : IJob { }

public interface IRepository<out TJob> where TJob : IJob
{
IEnumerable<TJob> GetJobs();
}

public class Repository<TJob> : IRepository<TJob> where TJob : IJob
{
public IEnumerable<TJob> GetJobs()
{
return new List<TJob>();
}
}

private static void Main(string[] args)
{
IJob iJob = new Job1(); // Valid
IRepository<IJob> repo = new Repository<Job1>(); // Also valid
}
}

有关协变和逆变的更多信息,请参阅:https://msdn.microsoft.com/en-us/library/dd799517%28v=vs.110%29.aspx

关于c# - C#泛型之间的类型转换有什么规则吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36038325/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com