2012-09-21 8 views
5

言って、私が持っているインタフェースインターフェイスからクラスへの暗黙のキャスト演算子を定義できないのはなぜですか?私はC#でそれを行うことができない理由はなく</p> <pre><code>public static implicit operator Control(ISomeControl ctrl) { return ctrl.MyControl; } </code></pre> <p>をまたは:

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

が、それは次のようになめらかに定義することは可能ですか?

+2

答えは: – leppie

+1

@leppie何が欠けていますか?なぜこのアプローチは絶対に間違っていますか? – horgh

+0

初心者のためにインターフェイスには実装ができないので、その演算子を定義する場所がありません – Jamiec

答えて

5

何がControlのサブクラスを持っていたし、そのサブクラスがISomeControlインタフェースを実装している場合。

class SomeControl : Control, ISomeControl {} 

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

+0

これはとても良い意味がある+1 – leppie

+0

インターフェイスからクラス型への変換を許可するのはあいまいかもしれませんが、クラスが定義している場合はあいまいではありません変換演算子をインタフェースからそれ自身に変換します。 'BaseType'から' Foo'への変換が存在する場合、 'DerivedType'クラスはあいまいさを生じることなく' Foo'への変換を定義することもできます。クラスが特定のインターフェイスを実装していないのにサブクラスが実装している場合、そのインターフェイスへの基本型参照のキャストは、参照されたオブジェクトがインターフェイスを実装しているかどうかにかかわらず、ユーザー定義の変換を使用する必要があります... – supercat

+0

... while派生クラス参照を使用する場合は、派生クラスに対して静的に定義されている変換を使用する必要があります。 'Foo :ISomething 'の場合でも、' ISomething 'への変換を指定すると、インタフェースはクラスにはない「問題」を引き起こすとは考えられません。 – supercat

1

これはできません。

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; 
     } 
    } 
+0

これは "なぜ?"とは言いません。また、彼はMicrosoftが提供する 'Control'クラスについて話していると思うので、追加することはできません。 –

+0

これがFramework Controlクラスかどうかわかりません。私はそれがほんの一例だと思った。 – Roland

+0

'Control'は* Microsoft提供の*クラス – horgh