我在两种引用类型之间有明确的转换设置。
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?
答案 0 :(得分:6)
为什么扩展方法能够隐式调用类型为Bike的Foo?
不是。您提供的代码会导致编译器错误。
至少有以下一种情况属实:
答案 1 :(得分:4)
现在您已修改代码以显示;
public static void Foo(this Car car, Bike bike)
{
car.Foo(bike);//Success...
}
你所做的就是创造一个具有讽刺意味的StackOverflowException。此方法现在只是递归调用自身,而不是Foo
中Car
的实现。
提示:给自己一份ReSharper - 它会在这行代码上放一个漂亮的圆圈箭头图标,告诉你发生了什么,而不需要编译或运行它。 : - )
答案 2 :(得分: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();
}
}