C#错误4无法隐式转换类型。通用接口

时间:2014-04-26 21:28:08

标签: c# generics inheritance types casting

对于有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();

1 个答案:

答案 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; }
}