关键字中的c#泛型“
我最近被分配到现有应用程序的一些维护工作。 我遇到以下代码:
public interface IEntityService<T, in TKey>
{
T GetEntityById(TKey id);
IEnumerable<T> GetAll();
void Update(T entity);
void Delete(TKey key);
}
我不确定in
关键字对于第二个泛型参数TKey
。
我遇到了以下MSDN文章(应该)向我完美地解释它:
(通用修饰符)(C#参考)
但是,我并没有真正理解它。 这就是它说的:
对于泛型类型参数,in关键字指定类型参数是逆变的。 您可以在通用接口和委托中使用in关键字。
逆变函数使您能够使用比泛型参数指定的派生类型更少的派生类型。 这允许实现变体接口的类的隐式转换以及隐式转换委托类型。 泛型类型参数的协变和反变量支持引用类型,但它们不支持值类型。
如果一个类型只能用作方法参数的一种类型,并且不能用作方法返回类型,则可以在泛型接口或委托中声明类型。 参考和输出参数不能是变体。
具有逆变类型参数的接口允许其方法接受派生类型少于接口类型参数指定的参数。 例如,因为在.NET Framework 4中,在IComparer接口中,类型T是逆变形的,可以将IComparer(Of Person)类型的对象分配给IComparer(Of Employee)类型的对象,而无需使用任何特殊的转换方法如果Employee继承Person。
可以为逆变委托分配另一个相同类型的委托,但派生的泛型类型参数较少。
我想这是有道理的,但特别引用
逆变函数使您能够使用比泛型参数指定的派生类型更少的派生类型。
它如何可以用于int
的任何用途? 有没有我会传入的“派生类型”?
我注意到int的唯一参考是在你的问题的最后一行。 你确定IEntityService<>
只能用于int
键吗? 可能它是为复合键(由多列组成的主键)构建的,
现在,例如在NHibernate中,对于复合键,您使用整个类来表示它们,因此您可以为表MyTable
a
class MyTableKey
{
public int Code;
public int SubCode;
}
如果你有一个辅助表MuSubtable
连接到该表,那么你可以有
class MySubtableKey : MyTableKey
{
public int SubSubCode;
}
其中MySubtable
是一个以主键为MyTable
( Code
+ SubCode
)的完整主键加上另一个字段( SubSubCode
)的SubSubCode
。
假设你有两个不同的实体,一个具有数据类型为“integer”的主键列,另一个使用“string”类型。
然后你可以使用IEntityService:
public class PersonService : IEntityService<Person, int>
{
int _id;
...
}
public class LogService : IEntityService<Log, string>
{
string _id;
...
}
链接地址: http://www.djcxy.com/p/39441.html
下一篇: Manipulate generic objects in parent abstract class (covariance/contravariance)