public interface ISomeControl
{
Control MyControl { get; }
...
}
が、それは次のようになめらかに定義することは可能ですか?
public interface ISomeControl
{
Control MyControl { get; }
...
}
が、それは次のようになめらかに定義することは可能ですか?
何がControl
のサブクラスを持っていたし、そのサブクラスがISomeControl
インタフェースを実装している場合。
class SomeControl : Control, ISomeControl {}
キャストはあいまいです。組み込みのアップキャストとユーザー定義の変換です。したがって、ユーザー定義の変換をインターフェースに提供することはできません。
これはとても良い意味がある+1 – leppie
インターフェイスからクラス型への変換を許可するのはあいまいかもしれませんが、クラスが定義している場合はあいまいではありません変換演算子をインタフェースからそれ自身に変換します。 'BaseType'から' Foo'への変換が存在する場合、 'DerivedType'クラスはあいまいさを生じることなく' Foo'への変換を定義することもできます。クラスが特定のインターフェイスを実装していないのにサブクラスが実装している場合、そのインターフェイスへの基本型参照のキャストは、参照されたオブジェクトがインターフェイスを実装しているかどうかにかかわらず、ユーザー定義の変換を使用する必要があります... – supercat
... while派生クラス参照を使用する場合は、派生クラスに対して静的に定義されている変換を使用する必要があります。 'Foo
これはできません。
C#の仕様は言う:
6.4.1許可されたユーザ定義の変換
C#の許可のみ特定のユーザ定義の変換が宣言されます。 では、暗黙的または明示的な変換を既に定義済みの に再定義することはできません。与えられたソース・タイプSとターゲット タイプTの場合、SまたはTがNULL可能タイプである場合、S0およびT0はそれらの 基礎タイプを参照します。そうでない場合、S0およびT0はそれぞれSおよびT に等しくなります。
S0およびT0は、異なるタイプである:クラスまたは構造体は、以下 の全てが真である場合にのみ、ターゲット・タイプTにソース・タイプSから変換 を宣言することが許されます。
いずれかのS0またはT0は、オペレータ宣言が行われるクラスまたは構造体の型です。
S0もT0もインターフェイスタイプではありません。ユーザー定義の変換を除く
、変換はSからTまたはTから、あなたがそれを行うことができます
一つの方法は、静的メソッドを持つことであるS.
に存在していません。public class Control
{
public static Control FromISomeControl(ISomeControl ctrl)
{
return ctrl.MyControl;
}
}
答えは: – leppie
@leppie何が欠けていますか?なぜこのアプローチは絶対に間違っていますか? – horgh
初心者のためにインターフェイスには実装ができないので、その演算子を定義する場所がありません – Jamiec