8

言う、私はインターフェースを持っています

public interface ISomeControl
{
    Control MyControl { get; }
    ...
}

このようなものを定義することは可能ですか?

public static implicit operator Control(ISomeControl ctrl)
{
    return ctrl.MyControl;
}

というか、C#でそれができないのはなぜですか?

4

2 に答える 2

6

のサブクラスがあり、そのサブクラスがインターフェイスControlを実装しているとしたらどうでしょう。ISomeControl

class SomeControl : Control, ISomeControl {}

現在、キャストはあいまいです-組み込みのアップキャストとユーザー定義の変換。したがって、インターフェイスにユーザー定義の変換を提供することはできません。

于 2012-09-21T16:00:35.580 に答える
1

それをしてはいけない。

C# の仕様は次のように述べています。

6.4.1 許可されているユーザー定義の変換

C# では、特定のユーザー定義の変換のみを宣言できます。特に、既存の暗黙的または明示的な変換を再定義することはできません。特定のソース型 S とターゲット型 T について、S または T が null 許容型の場合、S0 と T0 はそれらの基になる型を参照します。それ以外の場合、S0 と T0 はそれぞれ S と T に等しくなります。クラスまたは構造体は、ソースの型 S からターゲットの型 T への変換を宣言できるのは、次のすべてが当てはまる場合のみです。

  • S0 と T0 は異なるタイプです。

  • S0 または T0 は、演算子の宣言が行われるクラスまたは構造体の型です。

  • S0 も T0 もインターフェイス タイプではありません。

  • ユーザー定義の変換を除いて、S から T または T から S への変換は存在しません。

それを行う 1 つの方法は、静的メソッドを使用することです。

public class Control
    {
        public static Control FromISomeControl(ISomeControl ctrl)
        {
            return ctrl.MyControl;
        }
    }
于 2012-09-21T16:00:02.813 に答える