巴别塔上的雇工


C# Generics
9月 30, 2007, 6:31 上午
Filed under: 技术体会

C#从2.0开始支持Generics,某种意义上说,算是吸取了C++的教训,类型检查是基于type而不是signature,实际运行效率也比Java的Generics高,但是有一个很ridiculous的问题,那就是+-*/这样的运算符操作不能够作用在类型参数上。

public static void AssertEqual<T>(T v1, T v2)
{
    if (v1 == v2) // not allowed by C#
    {
        Console.WriteLine(" OK: {0} == {1}", v1, v2);
    }
    else
    {
        Console.WriteLine(" Fail: {0} == {1}", v1, v2);
    }
}

这样的code有C++背景的程序员可能觉得没有问题,但是实际上编译会出错误

error CS0019: Operator ‘==’ cannot be applied to operands of type ‘T’ and ‘T’

因为C#的检查是基于type而不是signature,也就是说,并不是实例化这个方法的时候看T类型是否支持operator ==,而是需要有constraint来显示声明T是一个支持operator ==的类型的子类,但是,C#中所有operator的重载函数必须是static,既然是static,就没有virtual可言,所以,没办法使用operator。

这个连接介绍了一个办法可以绕过去,但是很明显,既麻烦,效率也不高。


发表评论 so far
留下评论



留下评论