5

在 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对对象进行泛型,然后对它进行类型检查),但这效率低且不能很好地扩展。那么,再次,为什么?

4

3 回答 3

5

没有内在的原因这不可能存在。实现泛型类型约束的方式是通过接口调用。如果有一个提供了operator+this 的接口就可以了。

但是,所有相关类型都需要此接口,以便与基于 C++ 模板的类比一样通用。

另一个问题是 .NET 没有多重分派。接口调用将是不对称的:a.Plus(b)可能意味着不同于b.Plus(a). Equals有同样的问题,顺便说一句。

所以这个问题可能不符合“有用”栏或“成本/效用”栏。这不是一个不可能的问题,而是一个实际问题。

证明是可能的:((dynamic)a) + ((dynamic)b)

于 2013-01-15T18:21:53.590 回答
3

CLR 本身并不支持此类约束,C# 设计团队显然决定支持与 CLR 相同的一组约束。大概 CLR 团队和 C# 团队都认为实现这样一个特性的好处并没有超过规范、实现和测试它的成本。

如果您想使用支持此类约束的 .NET 语言,请考虑查看 F#。

于 2013-01-15T18:19:16.130 回答
0

有几种可能的方法来实现运算符约束,所有这些方法要么不重要(并且可能需要更改 CLR),要么具有明显的缺点(例如它们会很慢,比添加两个整数慢得多)。

这是相对容易解决的问题(无论是缓慢、通用dynamic且不安全的使用 . 正因为如此,这样的功能可能被认为是“很高兴拥有”,但远不足以保证进行此类更改。

于 2013-01-15T20:52:06.960 回答