質問
私はちょうどそれが最近の答えの一つに使用していた見ました
public static implicit operator bool(Savepoint sp)
{
return sp != null;
}
なぜ我々はここに単語のの暗黙のが必要なのか、そしてどのようなそれが意味するのでしょうか?
解決
暗黙の変換は、あなたのコード内のキャストを必要としないことを意味します。
あなたは今、これを行うことができます:
Savepoint point = new Savepoint();
if(point) // becomes a bool using your operator
{
}
の代わりにこれを実行することのます:
Savepoint point = new Savepoint();
if((bool)point) // an "explicit" conversion
{
}
これは便利な区別である理由の一つの例は、数値型です。 「大きな」タイプを「小さい」タイプ、例えばからの暗黙の変換があります:
float f = 6.5;
double d = f; // implicit conversion
彼は本当に問題の操作を実行しようとしていることを明確にするためにユーザーを強制的に、唯一の明示的な変換がありますので、しかし、小さい型に大きな型を変換することは、危険なことができます:
long l = 20;
// short s = l;
short s = (short)l; // explicit conversion
他のヒント
これは、暗黙的なオペレータの誤用のように見えます。私は、セーブポイント、クラスが何をするか分からないが、ブール値に変換することは論理的なようではありません。暗黙の演算子は、セーブポイントの参照がnullであるかどう単に参照を評価することにより確認することができます:
if (point) {
の代わりに:
if (point != null) {
それはそのように使われている場合は、、それはコードが実際にやっていることを隠している、それはC#はについてですほとんどすべてに反します。
ただ、mquanderの答えに追加します。
C#3.0の言語仕様から:
変換演算子の宣言その
implicit
キーワードを含んでいます ユーザー定義の暗黙のを紹介します 変換。暗黙的な変換することができます さまざまな状況で発生し、 関数メンバの呼び出しを含め、 式、および割り当てをキャストします。
(セクション10.10.3)
変換演算子は、ある型から別の型に変換します。暗黙のは、あなたが起こるに変換するためのコードで明示的なキャストを入力する必要がないことを意味し、明示的には、コード内のキャストが呼ばれるようにする必要があります。
あなたは変換はすべてのデータを失わないことが確実なときは、暗黙の型変換演算子を使用します。例えば、型変換を広げると(int型 - >ロング、フロート - >ダブル)。いくつかの状態が失われるか、自動的にすべての場所での変換を挿入することにより、クライアントコードを台無しにするようにコンパイラにしたくない時に明示的な変換演算子が使用されます。
この特定の変換を実行することはお勧めできませんので、あなたのような変換は、本当に大混乱をもたらすでしょう。
また、明示的なオペレーターがあるので「暗黙の」を指定する必要があります。
これはブールとセーブポイントの間の変換は、例えば、暗黙的に行うことができることを意味します=隠されています。
Savepoint s = new Savepoint();
bool b = s;
明示的な変換、例えば明らかに、この方法を行うことができます:
Savepoint s = new Savepoint();
bool b = (bool)s;
Int16 (short)
するいかなる可能なデータ損失、すなわちInt32 (int)
が存在しない場合の暗黙の変換がしばしば使用されます。しかし、それが可能だ場合、あなたはそれが明示的な変換を使用して「同意」する必要があります。
あなたの場合には、例えば、Savepoint
がある場合だけ
struct Savepoint
{
public bool data;
}
データの損失が可能でないので、あなたは、暗黙の型変換を使用することができます:
Savepoint s = new Savepoint();
s.data = true;
bool b = s;
そう、私は明示的な演算子を定義することをお勧めいたします!