我想要一个通用函数,该函数可以与具有TopBottomRightRect只读属性的类型一起使用-第三方库中有很多这样的类。

我这样写:

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;
    }
};

08-04 21:09