言う、私はインターフェースを持っています
public interface ISomeControl
{
Control MyControl { get; }
...
}
このようなものを定義することは可能ですか?
public static implicit operator Control(ISomeControl ctrl)
{
return ctrl.MyControl;
}
というか、C#でそれができないのはなぜですか?
言う、私はインターフェースを持っています
public interface ISomeControl
{
Control MyControl { get; }
...
}
このようなものを定義することは可能ですか?
public static implicit operator Control(ISomeControl ctrl)
{
return ctrl.MyControl;
}
というか、C#でそれができないのはなぜですか?
のサブクラスがあり、そのサブクラスがインターフェイスControl
を実装しているとしたらどうでしょう。ISomeControl
class SomeControl : Control, ISomeControl {}
現在、キャストはあいまいです-組み込みのアップキャストとユーザー定義の変換。したがって、インターフェイスにユーザー定義の変換を提供することはできません。
それをしてはいけない。
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;
}
}