GenericParameterAttributes 枚举
此文章由人工翻译。 将光标移到文章的句子上,以查看原文。
译文
原文

GenericParameterAttributes 枚举

描述对泛型类型或泛型方法的泛型类型参数的约束。

此枚举有一个 FlagsAttribute 属性,该属性使其成员值按位组合。

命名空间:  System.Reflection
程序集:  mscorlib(在 mscorlib.dll 中)

[FlagsAttribute]
public enum GenericParameterAttributes

成员名称说明
受 Silverlight for Windows Phone 支持受 Xbox 360 支持None没有任何特殊标志。
受 Silverlight for Windows Phone 支持受 Xbox 360 支持VarianceMask选择所有方差标志的组合。 此值是使用逻辑“或”将标志 ContravariantCovariant 进行组合的结果。
受 Silverlight for Windows Phone 支持受 Xbox 360 支持Covariant该泛型类型参数是协变的。 协变类型参数可以作为方法的结果类型、只读字段的类型、声明的基类型或实现接口出现。
受 Silverlight for Windows Phone 支持受 Xbox 360 支持Contravariant该泛型类型参数是逆变的。 逆变类型参数可以作为参数类型出现在方法签名中。
受 Silverlight for Windows Phone 支持受 Xbox 360 支持SpecialConstraintMask选择所有特殊约束标志的组合。 此值是使用逻辑“或”将标志 DefaultConstructorConstraintReferenceTypeConstraintNotNullableValueTypeConstraint 进行组合的结果。
受 Silverlight for Windows Phone 支持受 Xbox 360 支持ReferenceTypeConstraint仅当类型为引用类型时,才能替代泛型类型参数。
受 Silverlight for Windows Phone 支持受 Xbox 360 支持NotNullableValueTypeConstraint仅当类型是值类型且不可为空时,才能替代泛型类型参数。
受 Silverlight for Windows Phone 支持受 Xbox 360 支持DefaultConstructorConstraint仅当类型具有无参数构造函数时,才能替代泛型类型参数。

GenericParameterAttributes 枚举的成员分成两组,方差组和特殊约束组。 若要测试方差标志的 GenericParameterAttributes 值,请首先与 VarianceMask 执行一次按位“与”运算。 如果结果为 None,则没有任何方差标志。 类似地,SpecialConstraintMask 可用于测试约束标志。

下面的代码示例用两个类型参数定义一个泛型类型 Test 第二个类型参数具有一个基类约束和一个引用类型约束。 当程序执行时,使用 Type.GenericParameterAttributes 属性和 Type.GetGenericParameterConstraints 方法检查这些约束。

注意说明:

若要运行此示例,请参见生成使用 Demo 方法和 TextBlock 控件的示例


using System;
using System.Reflection;

// Define a sample interface to use as an interface constraint.
public interface ITest { }

// Define a base type to use as a base class constraint.
public class Base { }

// Define the generic type to examine. The first generic type parameter,
// T, derives from the class Base and implements ITest. This demonstrates
// a base class constraint and an interface constraint. The second generic 
// type parameter, U, must be a reference type (class) and must have a 
// default constructor (new()). This demonstrates special constraints.
//
public class Test<T, U>
   where T : Base, ITest
   where U : class, new() { }

// Define a type that derives from Base and implements ITest. This type
// satisfies the constraints on T in class Test.
public class Derived : Base, ITest { }

public class Example
{
   public static void Demo(System.Windows.Controls.TextBlock outputBlock)
   {
      // To get the generic type definition, omit the type
      // arguments but retain the comma to indicate the number
      // of type arguments. 
      //
      Type def = typeof(Test<,>);
      outputBlock.Text += String.Format("\r\nExamining generic type {0}", def) + "\n";

      // Get the type parameters of the generic type definition,
      // and display them.
      //
      Type[] defparams = def.GetGenericArguments();
      foreach (Type tp in defparams)
      {
         outputBlock.Text += String.Format("\r\nType parameter: {0}", tp.Name) + "\n";
         outputBlock.Text += String.Format("\t{0}",
             ListGenericParameterAttributes(tp)) + "\n";

         // List the base class and interface constraints. The
         // constraints are returned in no particular order. If 
         // there are no class or interface constraints, an empty
         // array is returned.
         //
         Type[] tpConstraints = tp.GetGenericParameterConstraints();
         foreach (Type tpc in tpConstraints)
         {
            outputBlock.Text += String.Format("\t{0}", tpc) + "\n";
         }
      }
   }

   // List the variance and special constraint flags. 
   //
   private static string ListGenericParameterAttributes(Type t)
   {
      string retval;
      GenericParameterAttributes gpa = t.GenericParameterAttributes;
      GenericParameterAttributes variance = gpa &
          GenericParameterAttributes.VarianceMask;

      // Select the variance flags.
      if (variance == GenericParameterAttributes.None)
         retval = "No variance flag;";
      else
      {
         if ((variance & GenericParameterAttributes.Covariant) != 0)
            retval = "Covariant;";
         else
            retval = "Contravariant;";
      }

      // Select 
      GenericParameterAttributes constraints = gpa &
          GenericParameterAttributes.SpecialConstraintMask;

      if (constraints == GenericParameterAttributes.None)
         retval += " No special constraints";
      else
      {
         if ((constraints & GenericParameterAttributes.ReferenceTypeConstraint) != 0)
            retval += " ReferenceTypeConstraint";
         if ((constraints & GenericParameterAttributes.NotNullableValueTypeConstraint) != 0)
            retval += " NotNullableValueTypeConstraint";
         if ((constraints & GenericParameterAttributes.DefaultConstructorConstraint) != 0)
            retval += " DefaultConstructorConstraint";
      }

      return retval;
   }
}
/* This example produces the following output:

Examining generic type Test`2[T,U]

Type parameter: T
        No variance flag; no special constraints.
        Base
        ITest

Type parameter: U
        No variance flag; ReferenceTypeConstraint DefaultConstructorConstraint
 */


Silverlight

受以下版本支持:5、4、3

Silverlight for Windows Phone

受以下版本支持:Windows Phone OS 7.1、Windows Phone OS 7.0

XNA Framework

受以下版本支持:Xbox 360、Windows Phone OS 7.0

有关 Silverlight 支持的操作系统和浏览器的列表,请参见 支持的操作系统和浏览器

社区附加资源

添加
显示:
© 2016 Microsoft