where 子句用于指定类型约束,这些约束可以作为泛型声明中定义的类型参数的变量。
1.接口约束。
例如,可以声明一个泛型类 MyGenericClass,这样,类型参数 T 就可以实现 IComparable<T> 接口:
public class MyGenericClass<T> where T:IComparable { }
2.基类约束:指出某个类型必须将指定的类作为基类(或者就是该类本身),才能用作该泛型类型的类型参数。
这样的约束一经使用,就必须出现在该类型参数的所有其他约束之前。
class MyClassy<T, U>
where T : class
where U : struct
{
}
3.where 子句还可以包括构造函数约束。
可以使用 new 运算符创建类型参数的实例;但类型参数为此必须受构造函数约束 new() 的约束。new() 约束可以让编译器知道:提供的任何类型参数都必须具有可访问的无参数(或默认)构造函数。例如:
public class MyGenericClass <T> where T: IComparable, new()
{
// The following line is not possible without new() constraint:
T item = new T();
}
new() 约束出现在 where 子句的最后。
4.对于多个类型参数,每个类型参数都使用一个 where 子句,
例如:
interface MyI { }
class Dictionary<TKey,TVal>
where TKey: IComparable, IEnumerable
where TVal: MyI
{
public void Add(TKey key, TVal val)
{
}
}
5.还可以将约束附加到泛型方法的类型参数,例如:
public bool MyMethod<T>(T t) where T : IMyInterface { }
请注意,对于委托和方法两者来说,描述类型参数约束的语法是一样的:
delegate T MyDelegate<T>() where T : new()
来自 https://www.cnblogs.com/nimorl/p/12579926.html
2010-10-15 8 views 1 likes
A
回答
3
它使用generics(C#的东西,与ASP.NET无关)。
<TEntity>
是泛型类型参数,这意味着您必须指定GenericRepository的类型。
像这样:
var repo = new GenericRepository<Person>();
的其中条款说你提供的类型必须是类。它被称为派生约束。它基本上告诉编译器执行这个约束。
如果将其更改为where TEntity : int
,则上述代码将失败。
你会需要这样的:
var repo = new GenericRepository<int>();
了一份关于<TEntity>
,这不是一个关键字/保留字。您可以轻松将其更改为<FooBar>
和where FooBar : class
。它具有T来表示泛型,而Entity指定存储库可以在实体之外工作。
将泛型类型参数更改为对您和您的代码有意义的内容。
顺便说一句 - 那篇文章就像我目前的圣经。 :)
+1
我明白了。所以“where子句”可以用来强制提供的对象是或者是任何物品的子类。在这种情况下,它是“类”,所以任何类都可以是通用的。因此,如果我要做“:IList”,它只接受实现IList接口的类;正确? – William 2010-10-15 01:54:56
+0
@William - 完全正确。发现。我们使用泛型来避免重复。如果你没有使用类型参数 - 你需要创建一个PersonRepository,CustomerRepository等重复代码。 – RPM1984 2010-10-15 02:01:59
来自 http://cn.voidcc.com/question/p-fkjunsvp-eh.html
C#和/或ASP.NET Class where子句?
我真的不知道这是C#还是asp.net的东西。我正在看这篇文章:http://huyrua.wordpress.com/2010/07/13/entity-framework-4-poco-repository-and-specification-pattern/并遇到这一行:
public class GenericRepository<TEntity> : IRepository<TEntity> where TEntity : class
我是C#/ ASP.NET的新手,所以我不完全理解这一行。 “TEntity:class”的作用是什么?我从来没有用“where子句”创建一个类(即使是它所谓的)。
它使用泛型(C#,与ASP.NET无关)。
<TEntity>
是泛型类型参数,这意味着您必须指定GenericRepository的类型。 像这样:
var repo = new GenericRepository<Person>();
where子句表示您提供的类型必须是类。 它被称为派生约束。它基本上告诉编译器强制执行此约束。 如果您将其更改为
where TEntity : int
,则上述代码将失败。 你需要这个:
var repo = new GenericRepository<int>();
关于
<TEntity>
的注释,这不是关键字/保留字。您可以轻松将其更改为
<FooBar>
和
where FooBar : class
。它具有指示泛型的T,以及指定存储库工作的实体。 将泛型类型参数更改为对您和您的代码有意义的参数。 顺便说一下 - 那篇文章就像我的圣经一样。 :)
来自 https://www.orcode.com/question/959317_ka68f1.html