【问题标题】:When should I use <> (or <,>)?什么时候应该使用 <>(或 <,>)?
【发布时间】:2015-08-11 12:59:52
【问题描述】:

目前我在泛型类型方面有点挣扎。

在阅读它时,我有时会遇到ISomeType&lt;&gt;

例如:

Type generic = typeof(Dictionary<,>);

https://msdn.microsoft.com/en-us/library/system.type.makegenerictype%28v=vs.110%29.aspx

我真的找不到关于空&lt;&gt; 表示的任何文档。

那么:我应该什么时候使用&lt;&gt;&lt;,&gt;

更新

正如@dcastro 所说,它被称为开放泛型,更多信息可以在这里找到:Generics -Open and closed constructed Types

更新 2

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

【问题讨论】:

  • 该示例上方的注释说“但保留将它们分开的逗号,以便编译器可以推断类型参数的数量”。它可能就这么简单 - 它取决于类型参数的数量..
  • 空的&lt;&gt; 表示你想引用未指定的类型。这通常与反射一起使用,因此您可以在运行时“填写”TParams
  • ISomeType&lt;&gt; 是一种具有一个泛型参数的开放泛型类型。 Dictionary&lt;,&gt; 是具有两个泛型参数的开放泛型类型。对于什么是开放泛型类型的描述,我链接的问题有一个响应
  • 空尖括号基本上只是表示“在此处插入类型”。例如List&lt;&gt; 可以是List&lt;string&gt;List&lt;int&gt;
  • 我有点不同意将此问题视为指定问题的副本。虽然这个问题可能由另一个问题的答案隐含地回答,但另一个问题是询问“开放泛型类型”一词的含义,而这个问题是询问语法摘录 &lt;&gt; 和 @987654336 的含义@。这就像一方面问override 做了什么,又问如何在一个方法中实现多态行为。这两个问题基本上可以同时回答,但是,它们是从不同角度“攻击”一个主题的两个不同问题。

标签: c#


【解决方案1】:

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

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# 中,只能使用空的 &lt;...&gt;,即避免在 typeof(...) 关键字中指定类型参数。

另一个例子:typeof(Dictionary&lt;,&gt;).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>();
}

【讨论】:

  • 我明白了。我可以将您的示例与typeof(Action&lt;,&gt;) 以任何方式与typeof(Action&lt;Foo,OtherFoo&gt; 进行比较吗?我的意思是;获取typeof(Action&lt;,&gt;) 有什么好的用途吗?
  • @Stefan 您在进行反射时主要使用typeof。在大多数其他情况下,您需要Action&lt;Foo, OtherFoo&gt;,其中FooOtherFoo 类型可以是类(或接口、结构、枚举、委托类型或数组类型),也可以是您自己的泛型类(接口、结构、委托类型)或您自己的泛型方法。
  • 我添加了一些(简化的)用途。
【解决方案2】:

当您创建一个接受多个类型参数的泛型类型时,您将使用 ,当您的类型接受单个参数时,您将使用 。

例如,字典使用键/值对实例化,您必须在其中定义键和值的类型,因此您为键和值都传递了类型参数。

Dictionary<type1,type2> myDictionary = new Dictionary<type1,type2>();

另一方面,Lists 只接受一个类型参数。

List<type> myList = new List<type>();

【讨论】:

  • 谢谢,但我的意思是空的&lt;&gt; :-) 看来我的谷歌搜索不够,因为问题似乎已经问过了。
  • 啊,我误解了你的问题,我的错 :)
猜你喜欢
  • 2023-04-02
  • 2011-04-15
  • 2017-04-10
  • 2012-03-19
  • 2018-05-12
  • 2018-12-11
  • 1970-01-01
  • 2022-09-28
  • 1970-01-01
相关资源
最近更新 更多