C# 为什么我的通用<;T>;没有解决吗?

C# 为什么我的通用<;T>;没有解决吗?,c#,generics,C#,Generics,我有一部班级电影: internal class Movie { public string Name { get; set; } public string Year { get; set; } } 我有这个密码: var Movies = CreateMovies(); //IEnumerable<Movie> var sorter = new Sorter<Movie>(); sorter.AddSort(Mo

我有一部班级电影:

internal class Movie
    {
        public string Name { get; set; }
        public string Year { get; set; }
    }
我有这个密码:

 var Movies = CreateMovies(); //IEnumerable<Movie>
 var sorter = new Sorter<Movie>();
 sorter.AddSort(Movies,  m => m.Year , a=>a.Name ,.....as many as I want....);
问题:

当我需要
d
上的智能时,它会显示:

我不明白为什么
t
不能推断为
Movie

看看有多少地方推断
T
电影


如何在不更改为“Ienumerable”的情况下显示这些电影字段

在编译
Sorter
类时,编译器不知道它将是什么类型,因此无法判断将使用它的用户是否具有
Year
属性

但是,您可以使用:

我们只能满足于

class Sorter<T> where T: ImyInterface
分类分拣机,其中T:imy接口

ImyInterface
将包含
Name
Year
的属性。我没有尝试使用此代码,但我认为您应该能够按照以下方式执行操作:

foreach(var func in funcs)
    movs = movs.OrderBy(func);

只需将排序函数委托给OrderBy方法,而不必关心这些函数是什么以及T是什么类(这违背了泛型的目的)。

以下是我如何解释您的问题和意图:

1> 您使用的是Sorter类与非泛型Sorter类,因为您希望该类处理多种类型

2> 因为对于AddSort方法,您希望它基于电影类成员,所以这表明您将拥有基于电影类的派生类,如XYXMovie:Movie等,Sorter将用于这些派生类

如果我以上的观察是正确的,那么您需要将您的分类器类与基类“Movie”绑定,以便它能够处理从类Movie派生的所有类型

为此,您必须使用where约束,比如类分类器where T:Movie


这会使您的分类器类绑定到基类Movie,但可以处理其所有子类。

泛型不是这样工作的。当您将其更改为
时,编译器会知道您正在处理
Movie
项。使用
,编译器将如何在方法中解析该类型参数?当使用Movie以外的其他内容调用AddSort时,您希望发生什么情况?@BoltClock Yes我忘记添加泛型约束。(太累了)。谢谢我投票决定关闭它,但这首先违背了拥有仿制药的目的。为什么
Sorter
而不仅仅是
MovieSorter
?@w0lf:您可以约束类型参数,同时保持其多态性。@BoltClock但应该有两个类,而不是:
Sorter
MovieSorter:Sorter
,不是吗?@BoltClock是的,我的观点是,
Sorter,其中T:Movie
相当于
MovieSorter
,其中所有出现的
T
都替换为
Movie
(即非通用类)
class Sorter<T> where T: Movie
class Sorter<T> where T: ImyInterface
foreach(var func in funcs)
    movs = movs.OrderBy(func);