目前我正在努力与泛型打字。
在阅读本文时,我有时会遇到ISomeType<>
。
E.g:
Type generic = typeof(Dictionary<,>);
https://msdn.microsoft.com/en-us/library/system.type.makegenerictype%28v=vs.110%29.aspx
我无法真正找到有关空<>
表示的任何文档。
所以:我什么时候应该使用<>
或<,>
?
更新:
正如@dcastro所述,它被称为开放式泛型,可在此处找到更多信息:Generics -Open and closed constructed Types
更新2
关于闭包参数,这个问题是关于语法的含义。
答案 0 :(得分:3)
您将使用&lt;,&gt;当您创建接受多个类型参数的通用类型时,&lt;&gt;当你的类型接受一个参数时。
例如,字典用键/值对进行实例化,您必须在其中定义键和值的类型,因此您为键和值传递类型参数。
Dictionary<type1,type2> myDictionary = new Dictionary<type1,type2>();
另一方面,Lists只接受一个类型参数。
List<type> myList = new List<type>();
答案 1 :(得分:3)
程序集可以在同一名称空间中定义具有相同名称的多个类型,只要每种类型的类型参数(通用参数)的数量不同即可。试试例如:
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>();
}