“where”在C#类声明中的含义是什么?

时间:2011-01-03 15:16:33

标签: c# .net generics

我试图谷歌这个,但我能找到的只是普通类声明的文件。

public class DataContextWrapper<T> : IDataContextWrapper where T : DataContext, new()
{

}

我看到该类实现了IDataContextWrapper,继承自DataContext,并根据实例化的方式因类型T而异。

我不知道“where T”或“, new()”可能意味着什么。

9 个答案:

答案 0 :(得分:38)

它是generic constraint并限制可以将哪些类型传递到通用参数。

在您的情况下,它要求TDataContext相同或派生,并且具有默认(无参数)构造函数(new()约束)。

你需要通用约束来实际使用泛型类型做一些非常简单的事情。

  • new()约束允许您使用new T()创建实例。
  • DataContext约束允许您在DataContext
  • 的实例上调用T的方法

MSDN写道:

  

where T : <base class name>   type参数必须是或来自指定的基类。

     

where T : new()   type参数必须具有公共无参数构造函数。与其他约束一起使用时,必须最后指定new()约束。

答案 1 :(得分:13)

仅允许从派生或实现DataContext的类型T,并且具有不带参数的公共构造函数。

答案 2 :(得分:9)

它是generic type constraint并指定泛型类型的约束(例如,只有类,或者必须实现特定的接口)。

在这种情况下,T必须是DataContext或从其继承的类,并且必须具有无参数的公共构造函数(new()约束)。

答案 3 :(得分:5)

这是一种通用类型限制。在这种情况下,T必须从DataContext继承,并且是一个带有不带参数的构造函数的类型。

答案 4 :(得分:4)

其中T:DataContext读作:T必须是(或从a派生)DataContext “,new()”读作:必须有一个无参数构造函数。

答案 5 :(得分:4)

where关键字用于约束您的泛型类型变量,在您的情况下,它意味着类型T必须是DataContext并且必须包含公共默认构造函数。

答案 6 :(得分:2)

可以用作通用的类型中的约束。这为您提供了编译器检查以及使用T做一些有意义的事情的能力。

IE中。 new()告诉编译器T必须有一个无参数构造函数。这意味着你可以通过编写new T();来实例化T的实例,并且知道T也是一个DataContext,你既可以创建T的实例,也可以调用它的方法。

答案 7 :(得分:2)

这是一种泛型约束。 MSDN有更多相关信息。

请参阅Constraints on Type Parameters (C# Programming Guide)

答案 8 :(得分:2)

在哪里对T的类型设置约束。新的说明类型T必须是可实例化的,没有任何参数。即T thing = new T();

查看更多here