C# “一个”究竟是什么;“打开泛型类型”;在.NET中?

C# “一个”究竟是什么;“打开泛型类型”;在.NET中?,c#,.net,generics,open-generics,C#,.net,Generics,Open Generics,我经历并了解到,对于一个方法来说,作为控制器的动作 它不能有一个“开放泛型类型” 我对泛型有些了解,并在一定程度上使用了它们,但是: 什么是.Net中的开放泛型类型 是否存在一种封闭泛型类型 开放泛型类型是一个不常使用的术语。使用/混淆了什么 C语言将开放类型定义为类型参数或使用未知类型参数定义的泛型类型: 所有类型都可以分为开放类型或封闭类型。开放类型是包含类型参数的类型。更具体地说: 类型参数定义打开类型 数组类型是开放类型当且仅当其元素类型是开放类型时 构造类型是开放类型当且仅当其

我经历并了解到,对于一个方法来说,作为控制器的动作

  • 它不能有一个“开放泛型类型”
我对泛型有些了解,并在一定程度上使用了它们,但是:

  • 什么是.Net中的开放泛型类型
  • 是否存在一种封闭泛型类型
  • 开放泛型类型是一个不常使用的术语。使用/混淆了什么
C语言将开放类型定义为类型参数或使用未知类型参数定义的泛型类型:

所有类型都可以分为开放类型或封闭类型。开放类型是包含类型参数的类型。更具体地说:

  • 类型参数定义打开类型
  • 数组类型是开放类型当且仅当其元素类型是开放类型时
  • 构造类型是开放类型当且仅当其一个或多个类型参数是开放类型时。构造的嵌套类型是开放类型当且仅当其一个或多个类型参数或其包含类型的类型参数是开放类型时
封闭类型是指不是开放类型的类型

因此,
T
List
Dictionary
Dictionary
都是开放类型(
T
U
是类型参数),而
List
Dictionary
是封闭类型

还有一个相关的概念:未绑定泛型类型是具有未指定类型参数的泛型类型。未绑定类型不能用于除
typeof()
之外的表达式,并且不能实例化它或调用它的方法。例如,
List
Dictionary
是未绑定类型

要澄清开放类型和未绑定类型之间的细微区别,请执行以下操作:

class Program {
   static void Main() { Test<int>(); }
   static void Test<T>() {
      Console.WriteLine(typeof(List<T>)); // Print out the type name
   }
}
这是
列表
的CLR名称。在运行时,类型参数显然是
System.Int32
。这使得
List
成为绑定打开类型

在运行时,您可以使用反射将类型参数绑定到未绑定泛型类型的未指定类型参数,方法如下:

要在运行时从构造的类型获取未绑定的类型,可以使用

Type listofit=typeof(List);
类型列表=listOfInt.GetGenericTypeDefinition();//=类型(列表)
请注意,对于泛型类型,可以使用完全未绑定的类型定义,也可以使用完全绑定的定义。不能绑定某些类型参数而不绑定其他类型参数。例如,您不能使用
字典
字典

一个“开放泛型类型”只是一个尚未指定其类型的泛型类型(例如,
货箱
)。一旦指定了混凝土类型(例如,
cargocratet
),它就会“关闭”

例如,假设您有如下内容:

public class Basket<T> {
  T[] basketItems;
}

public class PicnicBlanket<T> {
  Basket<T> picnicBasket;   // Open type here. We don't know what T is.
}

                                 // Closed type here: T is Food.
public class ParkPicnicBlanket : PicnicBlanket<Food> {
}
公共类篮{
T[]篮子物品;
}
公共类野餐毯{
篮子野餐篮子;//这里是开放式的。我们不知道t是什么。
}
//这里的封闭型:T是食物。
公共类公园野餐毯:野餐毯{
}
在这里,
野餐篮
的类型是打开的:尚未将任何内容分配给
T
。当您使用特定类型制作一个具体的野餐毯时——例如,通过编写
野餐毯p=new野餐毯()
——我们现在将其称为closed。

只是为了添加:

Dictionary
(或者更准确地说
Dictionary
)仍然是一种开放类型

例如:

void Foo<T>(Dictionary<string,T> dic) { ... }
void Foo(字典dic){…}

有三种泛型类型。简而言之,在此(简化)声明中:

public class Dictionary<TKey, TValue> : IEnumerable<KeyValuePair<TKey, TValue>>
公共类字典:IEnumerable
  • 字典
    是一种无边界泛型类型

  • 在本例中,
    KeyValuePair
    是一个开放构造的泛型类型。它有一些类型参数,但它们已经在别处定义(在本例中,在字典中)

  • 字典
    将是一个封闭构造的泛型类型


+1好消息-我今天学到了一些新东西。我知道List是泛型类型,但现在我知道了正确的技术术语。通过提供本身是开放泛型类型的类型参数,实际上可以部分关闭泛型类型。然而,这是一条死胡同。框架没有正式承认这个部分状态,将它视为既不关闭也不打开,因此它不允许您使用它做任何有用的事情。关于打开类型和未绑定类型之间的区别的伟大解释-以前不知道!我同意@chrisamerman。例如,您声称我们不能拥有的类型
Dictionary
,或多或少是由
typeof(Dictionary.MakeGenericType(typeof(int),typeof(Dictionary.GetGenericArguments()[1])
构造的。但也许你只是想说C#不允许语法
字典
,所以我们必须像我在这里做的那样手动创建它。。。。在示例部分的C#代码中,他们以更优雅的方式看待类型
Base`2[System.String,V]
,其中一个类型参数被具体类型替换,另一个类型参数被参数
V
替换。在查找规范时,我发现您是对的。我认为“泛型类型定义”与规范中的“开放类型”是一样的,但显然,规范调用了一个类型参数和
List
open类型,而
List
是一个未绑定的类型。澄清我的答案+1.
Type listOfInt = typeof(List<int>);
Type list = listOfInt.GetGenericTypeDefinition(); // == typeof(List<>)
public class Basket<T> {
  T[] basketItems;
}

public class PicnicBlanket<T> {
  Basket<T> picnicBasket;   // Open type here. We don't know what T is.
}

                                 // Closed type here: T is Food.
public class ParkPicnicBlanket : PicnicBlanket<Food> {
}
void Foo<T>(Dictionary<string,T> dic) { ... }
public class Dictionary<TKey, TValue> : IEnumerable<KeyValuePair<TKey, TValue>>