Tag: operator overloading

在C#中是否有任何方法可以在派生类中强制执行运算符重载?

我需要定义一个接口,它必须强制执行某些运算符重载到实现它的类型。 似乎没有一种明显的方法可以做到这一点,因为运算符重载必须在类中使用静态方法完成。 有没有办法达到相同的效果(使用抽象类或其他任何东西)?

字符串等式运算符==在c#中

我试图在C#中查看为字符串类中的比较运算符实现的代码。 发现是这样的: //THIS IS NOT WHAT I MEANT public static bool Equals(object objA, object objB) { return ((objA == objB) || (((objA != null) && (objB != null)) && objA.Equals(objB))); } //THIS IS WHAT I SEE REALLY and the above is what I would expect to see public static bool Equals(string a, string b) { […]

为什么C#不允许运算符重载?

为什么c#不允许运算符重载而C ++呢? 当我试图超载时,我收到了这个错误。 期望可重载二进制运算符 我的示例代码看起来像, public static MyClass operator +=(MyClass obj1, MyClass obj2) { … }

C#:隐式运算符和扩展方法

我正在尝试创建一个包含Expression<Func>的PredicateBuilder类,并提供一些方法来使用各种And和Or方法轻松构建表达式。 我认为如果我可以直接使用这个PredicateBuilder作为Expression<Func>会很酷,并认为这可以通过implicit operator方法来完成。 这个类的剥离版看起来像这样: class PredicateBuilder { public Expression<Func> Predicate { get; protected set; } public PredicateBuilder(bool initialPredicate) { Predicate = initialPredicate ? (Expression<Func>) (x => true) : x => false; } public static implicit operator Expression<Func>( PredicateBuilder expressionBuilder) { return expressionBuilder.Predicate; } } 然后,就像测试一样,我在静态类中有这个扩展方法: public static void PrintExpression(this Expression<Func> expression) { Console.WriteLine(expression); } 在我的脑海中,我应该能够做到这些: […]

VB.Net Power运算符(^)从C#重载

我正在编写一个暴露给VB.Net的C#类。 我想重载vb.net ^运算符,以便我可以写: Dim c as MyClass Set c = New … Dim d as MyClass Set d = c^2 在C#中, ^运算符是xor运算符,幂运算符不存在。 有没有办法可以做到这一点?

运算符’==’无法应用于类型T?

我认为这种方法有效,但我错了: static void Equals(T x, T y) { return x == y; //operator == can’t be applied to type T } 在阅读了规范(v3.0中的第7.2.4节和v4.0中的第7.3.4节)之后: 7.2.4二元运算符重载决策 forms为x op y的操作,其中op是可重载的二元运算符,x是类型X的表达式,y是类型Y的表达式,按如下方式处理: 由X和Y为操作运算符op(x,y)提供的候选用户定义运算符集合被确定。 该集合由X提供的候选运算符和Y提供的候选运算符组合而成,每个运算符使用§7.2.5的规则确定。 如果X和Y是相同的类型,或者如果X和Y是从公共基类型派生的,则共享候选运算符仅出现在组合集中一次。 如果候选用户定义的运算符集不为空,则这将成为该操作的候选运算符集。 否则,预定义的二元运算符op实现(包括它们的提升forms)成为该操作的候选运算符集。 给定运算符的预定义实现在运算符的描述中指定(第7.7节到第7.11节)。 §7.4.3的重载决策规则应用于候选运算符集合,以根据参数列表(x,y)选择最佳运算符,并且此运算符成为重载解析过程的结果。 如果重载决策无法选择单个最佳运算符,则会发生编译时错误。 在第2步中,我认为应该应用此预定义实现: bool operator ==(object x, object y); bool operator !=(object x, object y); 因为C#中的所有内容都来自Object。 如何在步骤3中发生编译时错误? 在这种情况下,我认为“重载决议无法选择”是可能的。 编辑当我实现这样的事情时,我想到了这个问题: class EnumComparer : IEqualityComparer […]

隐式方法组转换问题(第2部分)

从这个问题简化并摆脱了LinqPad的可能影响(没有密集),这样一个简单的控制台应用程序: public class Program { static void M() { } static void Main(string[] args) { Action a = new Action(M); Delegate b = new Action(M); Console.WriteLine(a == b); //got False here Console.Read(); } } “false”结果来自上面代码的CIL中的运算符ceq (有关详细信息,请访问原始问题)。 所以我的问题是: (1)为什么==正在转换为ceq而不是call Delegate Equals ? 在这里,我不关心Delegate和Action之间的(un)包装。 最后,在评估a == b ,a是Action类型,而b是Delegate 。 从规格: 7.3.4二元运算符重载决策 forms为x op y的操作,其中op是可重载的二元运算符,x是类型X的表达式,y是类型Y的表达式,按如下方式处理: •确定由操作运算符op(x,y)的X和Y提供的候选用户定义运算符集。 该集合由X提供的候选运算符与Y提供的候选运算符的并集组成,每个运算符使用§7.3.5的规则确定。 如果X和Y是相同的类型,或者如果X和Y是从公共基类型派生的,则共享候选运算符仅出现在组合集中一次。 […]

在C#中重载复合赋值运算符的简单方法?

有没有人有一个非常简单的例子,说明如何在C#中重载复合赋值运算符?

用户定义的结构是否inheritance了重载的==运算符?

如果引用类型不重载等于运算符== ,则将使用Object上的内置相等运算符。 为什么用户定义的structs不一样: struct A{ } static void Main(string[] args) { A a = new A(); A a1 = new A(); bool equal= (a == a1); //error } 也就是说, ValueType (所有structs派生自哪个)也不会重载==运算符?

我可以为两个我不直接控制的类添加隐式转换吗?

我希望能够在两个不相容的类之间隐式转换。 其中一个类是Microsoft.Xna.Framework.Vector3 ,另一个类只是F#项目中使用的Vector类。 我正在使用XNA在C#中编写一个3D游戏,并且 – 虽然它是用3D绘制的,但游戏只在两个维度上进行(它是一个鸟瞰图)。 F#类使用2D矢量处理物理: type Vector SuperUnit> = | Cartesian of ‘t * ‘t | Polar of ‘t * float member this.magnitude = match this with | Cartesian(x, y) -> x.newValue(sqrt (x.units ** 2.0 + y.units ** 2.0)) | Polar(m, _) -> m.newValue(m.units) member this.direction = match this with | Cartesian(x, y) […]