Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/269.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在两个参数都是接口的情况下编写重载运算符_C#_Interface_Operators_Operator Overloading - Fatal编程技术网

C# 如何在两个参数都是接口的情况下编写重载运算符

C# 如何在两个参数都是接口的情况下编写重载运算符,c#,interface,operators,operator-overloading,C#,Interface,Operators,Operator Overloading,我的大部分东西都使用界面。我找不到一种方法来创建一个重载操作符+,它允许我对实现IPoint接口的任何对象执行加法 代码 你没有。想象一下,如果有两个IPoint实例a和b,它们都是不同的类(实现IPoint)。现在叫“a+b”。哪个操作员+被呼叫?返回哪种混凝土类型 编辑:抱歉,请澄清您的评论,“不是目前的C语言”。我有一些关于你是否能做到这一点的菲利普斯式的争论,因为我怀疑你会制造一些重大的混乱 我认为你不能按你的要求去做,我已经回顾了过去,结果是空的。问题是,即使在使用的示例中,添加仍然需

我的大部分东西都使用界面。我找不到一种方法来创建一个重载操作符+,它允许我对实现IPoint接口的任何对象执行加法

代码


你没有。想象一下,如果有两个IPoint实例a和b,它们都是不同的类(实现IPoint)。现在叫“a+b”。哪个操作员+被呼叫?返回哪种混凝土类型


编辑:抱歉,请澄清您的评论,“不是目前的C语言”。我有一些关于你是否能做到这一点的菲利普斯式的争论,因为我怀疑你会制造一些重大的混乱

我认为你不能按你的要求去做,我已经回顾了过去,结果是空的。问题是,即使在使用
的示例中,添加
仍然需要将
移动
参数强制转换为
点类型
,才能访问该方法。我认为这是C#的一个限制,如果我错了,我很乐意知道

我的建议是,如果你知道你总是会在
MoveOf
中得到一个
点类型
,那么总是将它投射到方法内部的
是安全的,但是如果是这种情况,那么你应该接受
作为参数


我唯一能说的另一件事是,如果您最初创建一个
点类型
,并将其传递给
MoveOf
,您可以在铸造它之前检查
MoveOf
内部的
移动类型。当然,这里的问题是,您最终必须对继承自
IPoint
所有类型执行此操作,并使用
MoveOf
方法。

目前在C中无法执行此操作。我们考虑以“扩展操作符”的形式将此功能添加到C#4.0中,但它的优先级不够高,因此被删除。很抱歉谢谢,这回答了我的问题!这就是问题的关键:有没有一种方法可以编写一个未附加到特定类的重载(如在C++中)。在我的例子中,我希望在调用IPoint的2个实例时调用我定义的操作符。

interface IPoint
{
    double X { get; set; }
    double Y { get; set; }
}

class Point : IPoint
{
   double X { get; set; }
   double Y { get; set; }

   //How and where do I create this operator/extension  ???
   public static IPoint operator + (IPoint a,IPoint b)
   {
     return Add(a,b);
   }

   public static IPoint Add(IPoint a,IPoint b)
   {
      return new Point { X = a.X + b.X, Y = a.Y + b.Y };
   } 
}

   //Dumb use case :
public class Test
{
   IPoint _currentLocation;

   public Test(IPoint initialLocation)
   {
     _currentLocation = intialLocation
   }
   public MoveOf(IPoint movement)
   {

      _currentLocation = _currentLocation + intialLocation;
     //Much cleaner/user-friendly than _currentLocation = Point.Add(_currentLocation,intialLocation); 
   }
}