什么时候应该使用<>(或& 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

对于闭包参数,这个问题是关于语法的含义。

什么时候应该使用<>(或& lt;祝辞)

程序集可以在同一名称空间内定义具有相同名称的多个类型,只要每种类型的类型参数(泛型参数)的数量不同即可。例如:

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