0

2 つの参照型間の明示的な変換設定があります。

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 つに該当します。

  1. ここで提供したコードは、コンパイルしようとしているコードではありません。
  2. ここで追加しなかった暗黙的な変換がコードに含まれています。
  3. コードを実際にコンパイルしておらず、コンパイルされないことに気づいていないだけです。
于 2013-01-22T22:53:13.207 に答える
4

表示するコードを変更したので、

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

皮肉な StackOverflowException を作成しただけです。Fooこのメソッドは、 inの実装ではなく、自分自身を再帰的に呼び出しているだけ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 に答える