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);