我想要一个通用函数,该函数可以与具有Top
,Bottom
,Right
和Rect
只读属性的类型一起使用-第三方库中有很多这样的类。
我这样写:
internal class MyTemplate<WhatType> {
internal static void Work( WhatType what )
{
int left = what.Left;
}
};
我希望它能正常工作-C ++中的等效代码会正常工作。但是C#对象:
错误CS1061:'WhatType'不包含'Left'的定义,并且找不到找到接受类型为'WhatType'的第一个参数的扩展方法'Left'(您是否缺少using指令或程序集引用?)
我不明白-为什么在我调用它之前会尝试实例化模板?当然,尚不知道
WhatType
类型,因此找不到属性。我在做什么错,我该如何解决?
最佳答案
C#泛型看起来与C ++模板相似,但实际上却完全不同。 C#泛型是强类型的,因此您不能调用静态未知的成员。
为了能够在类型为Left
的对象上调用WhatType
,必须使用通用约束指定WhatType
实现接口或从定义Left
的类继承。例如:
interface IHasPosition
{
int Left { get; }
int Top { get; }
}
internal class MyTemplate<WhatType> where WhatType : IHasPosition
{
internal static void Work( WhatType what )
{
int left = what.Left;
}
};