0

我有两个引用类型之间的显式转换设置。

class Car
{
    public void Foo(Car car)
    {

    }

    public static explicit operator Bike(Car car)
    {
        return new Bike();
    }

}

class Bike
{

}

如果我调用 Foo 并传递一个 类型Bike,那么我必须执行显式转换。

            Car myCar = new Car();
            Bike bike = (Bike)myCar;            
            myCar.Foo(bike);//Error: Cannot convert from Bike to Car.

但是,如果我添加扩展方法,则不再需要显式转换。

        public static void Foo(this Car car, Bike bike)
        {
            car.Foo(bike);//Success...
        }

为什么扩展方法能够Bike隐式调用 Foo 类型?

4

3 回答 3

6

为什么扩展方法能够隐式调用具有 Bike 类型的 Foo ?

它不是。您提供的代码会导致编译器错误。

以下至少一项是正确的:

  1. 您在此处提供的代码不是您要编译的代码。
  2. 您的代码中有一个未在此处添加的隐式转换。
  3. 你只是没有真正编译你的代码,也没有注意到它不会编译。
于 2013-01-22T22:53:13.207 回答
4

现在您已经修改了要显示的代码;

public static void Foo(this Car car, Bike bike)
{
    car.Foo(bike);//Success...
}

您所做的只是创建一个具有讽刺意味的 StackOverflowException。这个方法现在只是递归地调用自己,而不是Fooin的实现Car

提示:为自己获取一份 ReSharper - 它会在这行代码上放置一个漂亮的圆形箭头图标,以向您展示正在发生的事情,而无需实际编译或运行它。:-)

于 2013-01-22T23:01:19.597 回答
0

您的显式转换不应该在 Bike 上定义吗?

class Bike
{
    public static explicit operator Bike(Car car)
    {
        return new Bike();
    }
}

这允许:

Car myCar = new Car();
Bike myBike = (Bike) myCar;

如果您希望能够在不指定转换的情况下执行此操作,则应使用implicit关键字。

Car myCar = new Car();
Bike myBike = myCar;

最后,你在哪里得到错误//Error: Cannot convert from Bike to Car.这表明你需要逆转换......

class Car
{
    // FROM Bike TO Car
    public static explicit operator Car(Bike bike)
    {
        return new Car();
    }
}
于 2013-01-22T23:06:33.927 回答