什么时候应该使用<>(或& lt;祝辞)
本文关键字:lt 祝辞 什么时候 | 更新日期: 2023-09-27 18:07:22
目前我正在与泛型打字作斗争。
在阅读时,我有时会遇到ISomeType<>
。
例如:
Type generic = typeof(Dictionary<,>);
https://msdn.microsoft.com/en-us/library/system.type.makegenerictype%28v=vs.110%29.aspx 我真的找不到任何关于空的<>
是什么意思的文档。
所以:我应该什么时候用<>
还是<,>
?
:
正如@dcastro所说,它被称为开放泛型,更多信息可以在这里找到:泛型-开放和封闭构造类型
更新2
对于闭包参数,这个问题是关于语法的含义。
程序集可以在同一名称空间内定义具有相同名称的多个类型,只要每种类型的类型参数(泛型参数)的数量不同即可。例如:
var strA = typeof(Action).ToString(); // "System.Action"
var strB = typeof(Action<>).ToString(); // "System.Action`1[T]"
var strC = typeof(Action<,>).ToString(); // "System.Action`2[T1,T2]"
var strD = typeof(Action<,,>).ToString(); // "System.Action`3[T1,T2,T3]"
在c#中,只能在typeof(...)
关键字中使用空的<...>
,即避免指定类型参数是什么。
另一个例子:typeof(Dictionary<,>).ToString()
给出"System.Collections.Generic.Dictionary`2[TKey,TValue]"
。如您所见,在。net (CLI)中,泛型参数的数量是通过在后面加一个反打号,后跟一个数字来给出的。
使用示例:
static bool IsDictionary(object obj)
{
if (obj == null)
return false;
var t = obj.GetType();
return t.IsGenericType && t.GetGenericTypeDefinition() == typeof(Dictionary<,>);
}
static object GetDictionary(object a, object b)
{
var t = typeof(Dictionary<,>).MakeGenericType(a.GetType(), b.GetType());
return Activator.CreateInstance(t);
}
但如果可能的话,避免反射并使用编译时类型,例如(不完全等同于上面的):
static Dictionary<TA, TB> GetDictionary<TA, TB>(TA a, TB b)
{
return new Dictionary<TA, TB>();
}
当您创建接受多个类型参数的泛型类型时,将使用<,>,当您的类型接受单个参数时,将使用<>。
例如,字典是用键/值对实例化的,其中必须定义键和值的类型,因此为键和值传递类型参数。
Dictionary<type1,type2> myDictionary = new Dictionary<type1,type2>();
另一方面,Lists只接受一个类型形参。
List<type> myList = new List<type>();