Generics C#6泛型只显式提供其中一种类型
根据这个定义Generics C#6泛型只显式提供其中一种类型,generics,lambda,html-helper,asp.net-mvc-5,c#-6.0,Generics,Lambda,Html Helper,Asp.net Mvc 5,C# 6.0,根据这个定义 public static HtmlTable<TRowModel> DisplayTable<TModel, TRows, TRowModel>(this HtmlHelper<TModel> helper, Expression<Func<TModel, TRows>> expression, TRowModel rowModel = default(TRowModel)) where TRows : IEnu
public static HtmlTable<TRowModel> DisplayTable<TModel, TRows, TRowModel>(this HtmlHelper<TModel> helper, Expression<Func<TModel, TRows>> expression, TRowModel rowModel = default(TRowModel)) where TRows : IEnumerable<TRowModel>
{
Func<TModel, TRows> deleg = expression.Compile();
TRows result = deleg(helper.ViewData.Model);
return new HtmlTable<TRowModel>(helper.ViewData.Model, result);
}
我希望能够显式地只指定TRowModel
类型,以便像这样调用扩展名
@(Html.DisplayTable<RowViewModel>(m => m.ListTest).Render())
其中,RowViewModel
可以从我用限制lambda参数的事实推断出来,其中TRows:IEnumerable
这在C#6中可能吗?如果没有,我有什么办法可以避免传递空对象,这样我就不必显式地指定菱形中的每一种类型了?注意:这篇文章只想让我把这个问题标记为已回答的问题 答案:在C#中,当涉及泛型时,必须明确指定它们ALL,除非它们可以ALL被推断为用法调用。
此
参数是此规则的唯一例外
感谢并感谢您的回答。如果所有泛型类型都可以从参数中推断出来,那么您可以将它们全部省略。如果不是所有类型都是可推断的,则必须指定所有类型(除了
此
参数)。有关更多信息,请参见伟大的Jon Skeet的回答:您确实可以推断泛型的用法,但如果您开始指定这些,则必须进行到底。它要么是DoSomething(“foo”,1)代码>或剂量测量(“条形”,2)代码>编辑:@PeterB比我快谢谢你们两位的帮助。我现在对泛型有了更多的了解。我对此很不满意。。。这意味着我必须保留这个丑陋的,新的RowViewModel()
,对于一个库来说,它既不友好也不美观。我想我没有办法使用TRows
被迫成为IEnumerable
的事实来使用TRowModel
中的TRows:IEnumerable
?如果这是可能的,我不会违背你刚才给我的规则“要么全部要么没有”。。。
@(Html.DisplayTable<RowViewModel>(m => m.ListTest).Render())
@(Html.DisplayTable(m => m.ListTest).Render())