すべてのクラスと型がobject
から継承します。それ以外では、別のクラスがどのクラスから派生しているかによって異なります。これを使用して、コンパイラは、あるものが別のものにキャストできるかどうかを判断できます。これらのチェックの中には、コンパイル時に決定するものと実行時に決定するものがあります。
を考えてみましょう:
今
class A
class B
class C
class D
class E
、E
への参照を与える、私は安全にD
またはA
(またはobject
)にキャストすることができます。コンパイラは、E
をC
またはB
にキャストしようとすると、E
はこれらの2つを継承しないため、A
という共通の基底クラスを共有しているため、変換が利用できないことがわかります。
A
への参照があり、E
にキャストしようとした場合を考えてみましょう。このチェックは、コンパイル時に実行することはできず、問題のインスタンスが実際にE
のインスタンスでない場合(実行時に 'A、B、C、D、E'のいずれかとなります)、失敗します。
さらに、Silvermindは指摘しているように、私たち自身のimplicit
とexplicit
の変換を提供することはできません。
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;
暗黙的および明示的な演算子もあります。 – Silvermind
DataGridViewTextBoxColumnはTextBoxから派生していますが、なぜコンパイラがそのキャストを防ぐのですか? – Burimi
@ Silvermind、ありがとうございます - 私は答えを更新しました。 –