<分区>
在C++中,你可以这样写代码:
template<class T>
T Add(T lhs, T rhs)
{
return lhs + rhs;
}
但是,你不能在 C# 中做这样的事情:
public static T Add<T>(T x, T y) where T : operator+
{
return x + y;
}
有什么原因吗?我知道这可以通过反射(泛型 Add
对象,然后对所有对象运行类型检查)来完成,但这效率低下且扩展性不佳。那么,又是为什么?
这没有不存在的内在原因。通用类型约束的实现方式是通过接口(interface)调用。如果有一个提供 operator+
的接口(interface),这就可以了。
不过,所有 相关类型都需要此接口(interface),以便与基于 C++ 模板的类比一样通用。
另一个问题是 .NET 没有多重分派(dispatch)。接口(interface)调用将是非对称的:a.Plus(b)
可能意味着不同于 b.Plus(a)
的东西。 Equals
也有同样的问题,顺便说一句。
所以这个问题可能不符合“有用性”-bar 或“成本/效用”-bar。这不是不可能的问题,而是实际问题。
证明这是可能的:((dynamic)a) + ((dynamic)b)
。