我什么时候应该使用<> (或<,>)?

时间:2015-08-11 12:59:53

标签: c#

目前我正在努力与泛型打字。

在阅读本文时,我有时会遇到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

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

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