c# - 为什么不能在泛型中要求运算符重载

标签 c# .net generics cil cil-metadata

<分区>

在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)

关于c# - 为什么不能在泛型中要求运算符重载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14343932/

相关文章:

c# - 如何访问 TabControl 选项卡内的控件?

c# - 如何删除DataGridView中特定链接单元格的下划线

c# - 复制大文件时更新进度条

swift - 具有泛型和特化的协议(protocol)

c# - 使用 C# 执行 SSIS 包时出错

c# - 策略模式与依赖注入(inject)

c# - Azure 上的 MongoDB : replSet can't get local. system.replset 配置

c# - 避免连续、相似条件 block 的方法

c++ - gcc模板错误

c# - 将 MVC 4 升级到 MVC 5 连接问题