2012-03-16 8 views
0

先週、オブジェクトキャスト(DataGridView Columns Controlキャスト)を処理し、DataGridView TextBox ColumnをTextBox Controlにキャストしようとしました。コンパイラは、型を別の型にキャストできるかどうかを判断します。

私は、TextBox ColumnをDataGridViewTextBoxColumnにキャストする必要があることがわかりました。型が別の型(オブジェクトほとんど)にキャストできる場合

は、どのようにコンパイラが決めるのでしょうか?

次に、コンパイラでいくつかのキャストを実行できるようにするケースがありますが、実行時エラーが発生します。

答えて

5

すべてのクラスと型がobjectから継承します。それ以外では、別のクラスがどのクラスから派生しているかによって異なります。これを使用して、コンパイラは、あるものが別のものにキャストできるかどうかを判断できます。これらのチェックの中には、コンパイル時に決定するものと実行時に決定するものがあります。

を考えてみましょう:

class A 
    class B 
    class C 
    class D 
     class E 

Eへの参照を与える、私は安全にDまたはA(またはobject)にキャストすることができます。コンパイラは、ECまたはBにキャストしようとすると、Eはこれらの2つを継承しないため、Aという共通の基底クラスを共有しているため、変換が利用できないことがわかります。

Aへの参照があり、Eにキャストしようとした場合を考えてみましょう。このチェックは、コンパイル時に実行することはできず、問題のインスタンスが実際にEのインスタンスでない場合(実行時に 'A、B、C、D、E'のいずれかとなります)、失敗します。

さらに、Silvermindは指摘しているように、私たち自身のimplicitexplicitの変換を提供することはできません。

public class Person 
{ 
    private string name_; 

    public Person(string name) 
    { 
     name_ = name; 
    } 

    // allow conversion to a string 
    public static implicit operator string(Person p) 
    { 
     return p.name_; 
    } 
} 

上記の私たちが行くことができます::

Person p = new Person("Moo-Juice"); 
string name = (string)p; 

たちの暗黙のオペレータがなければ何の変換は、デフォルトでPersonからstringに存在していないとして、これは(明らかに)コンパイル時に失敗するだろう、これは考えてみましょう。

明示的な演算子は似ていますが、他の方法で動作します。これは文字列をにキャストしたい場合に発生します。だから我々は、次の明示的なオペレータ追加することができます。

public static explicit operator Person(string name) 
{ 
    return new Person(name); 
} 

をそして今、我々はこれを行うことができます:

string name = "Moo-Juice"; 
Person p = (Person)name; 
+0

暗黙的および明示的な演算子もあります。 – Silvermind

+0

DataGridViewTextBoxColumnはTextBoxから派生していますが、なぜコンパイラがそのキャストを防ぐのですか? – Burimi

+0

@ Silvermind、ありがとうございます - 私は答えを更新しました。 –

関連する問題