对于有C#经验的人来说,这个问题应该很容易解决。我想做到这样,主题可以有一个课程列表。这个应用程序中有导师和学生。因此,我创建了一个通用Subject,它定义了Tutor_Subject和Student_Subject实现的属性。但是我得到一个奇怪的投射错误。
public interface Subject<TCourse> where TCourse : Course
{
int SubjectId { get; set; }
string Name { get; set; }
ICollection<TCourse> Courses { get; set; }
}
public partial class Student_Subject :Subject<Student_Course>
{
}
public partial class Tutor_Subject :Subject <Tutor_Course>
{
}
public interface Course
{
int CourseId { get; set; }
string Name { get; set; }
}
public partial class Student_Course :Course
{
}
public partial class Tutor_Course :Course
{
}
这是问题
无法将“Tutor_Subject”类型隐式转换为“课程”。存在显式转换(您是否错过了演员?)
Subject<Course> subject;
if(type ==1)
{
subject = new Student_Subject(); // Error
courseList = subjectInfo["courses"].ToObject<IList<Student_Course>>();
}
else
{
subject = new Tutor_Subject(); // Error
courseList = subjectInfo["courses"].ToObject<IList<Tutor_Course>>();
}
subject.Name = subjectName;
subject.Courses = courseList.ToList();
答案 0 :(得分:1)
从C#4开始,使用泛型时,必须使用泛型参数定义中的 out 关键字明确告诉编译器泛型类型可能是更加派生的类型(协变):
http://msdn.microsoft.com/en-us/library/dd469487.aspx
public interface Subject<out TCourse> where TCourse : Course
{
int SubjectId { get; set; }
string Name { get; set; }
IEnumerable<TCourse> Courses { get; set; }
}