请教一个范型方法的问题

ahking 2018-02-28 10:16:13
在asp.net core中的startup.cs中,可以添加DI服务:

services.AddTransient<IDevRepo, DevRepo>();

范型方法有一个类型可以理解,这个方法中有两个类型,是什么语法结构?如果有参数,参数是怎么传递的
...全文
354 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
正怒月神 2018-03-01
  • 打赏
  • 举报
回复
泛型可以是多类型的。 这个很正常。只是你可能List<T>这种用习惯了。
  • 打赏
  • 举报
回复
泛型是动态语言特征,既有其语法糖的优越性、当然有又动态语言的危险性。只不过这种危险性小一些,所以才会提早、广泛使用(c++中的模板在几十年前就广泛使用了)。 比如说上面代码使用
test<int, char>();
来调用,那么c#编译器检查不出来这种垃圾代码,这种代码只有在运行时才会悲催地崩溃在用户面前,这就是动态语言的缺点。 而优点,自然就是省得你 copy 代码n次然后逐一修改里边的 type(....) 那各部分了。是 .net 在程序运行时动态产生的源代码然后使用 JIT 编译的,而不需要你在自己的源代码中重复书写多个类型。
  • 打赏
  • 举报
回复
举个例子,比如说代码
void test<A, B>()
{
    var a = Convert.ChangeType(DateTime.Now.Ticks / 90000000000.0, typeof(A));
    var b = Convert.ChangeType(DateTime.Now.Ticks / 90000000000.0, typeof(B));
    Console.WriteLine($"a={a}, b={b}, equals={a.Equals(b)}");
}
这里在运行时就会根据范型模板中给每一个参数的不同而动态产生不同代码。 而这个方法根本没有参数,此时如果说什么“传递泛型方法参数”也就根本没有意义!
  • 打赏
  • 举报
回复
引用 楼主 ahking 的回复:
范型方法有一个类型可以理解,这个方法中有两个类型,是什么语法结构?如果有参数,参数是怎么传递的
这个方法并没有输入参数,或者说输入参数个数为0。可能你把泛型声明个数跟参数声明个数搞混了。即使是没有参数,声明3个5个泛型类型也是很“正常的”,泛型声明是让编译器(JIT运行时及时编译)产生不同的代码,比如说
List<int>
List<double>
在运行时就会自动产生两个无关的类型,使用同一套 List<T> 模板而分分裂产生两个无关的类型定义代码,然后将这两个类型的源代码应用到目标程序上。 所以泛型声明需要几个,完全看代码模板的内部。而不是看参数有几个!
xuzuning 2018-03-01
  • 打赏
  • 举报
回复
表示两个参数分别是 IDevRepo 和 DevRepo 类型的
  • 打赏
  • 举报
回复
我们可以随便写一个测试方法
static void test1<A, B, C>()
{
    Console.WriteLine(typeof(B).FullName);
    var x = default(A);
    Console.WriteLine(x.GetType().FullName);
}
这里连 C 都没有用到,但是我们知道我们其实使用这里的 C 的意思是让 JIT 动态编写产生无数新的 class 代码,知道这个就理解了泛型了。
SoulRed 2018-02-28
  • 打赏
  • 举报
回复
类似 T1,T2,T3,TN。。。其实都可以的。 建议你看一下泛型模板相关,很有用的
threenewbee 2018-02-28
  • 打赏
  • 举报
回复
看下返回值,它需要2个类型
秋的红果实 2018-02-28
  • 打赏
  • 举报
回复
有啊,比如KeyValuePair<TKey,TValue>,还有字典dictionary等 怎么用,那要看人家需要什么参数了,看智能提示 core是包括.net类库的

110,534

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧