今はGuid
sさんと一緒です。
コード全体で、この暗黙的な変換が機能する場所と機能しない場所があることを確かに覚えています。今まで私はパターンを見ることができませんでした。
コンパイラは、できない場合をどのように決定しますか? つまり、型メソッドGuid.ToString()
が存在するということは、この変換が必要になるたびに呼び出されるのではないでしょうか?
myInstance.ToString()
この変換が自動的に行われる状況と、明示的に呼び出す必要がある場合を教えてください。
今はGuid
sさんと一緒です。
コード全体で、この暗黙的な変換が機能する場所と機能しない場所があることを確かに覚えています。今まで私はパターンを見ることができませんでした。
コンパイラは、できない場合をどのように決定しますか? つまり、型メソッドGuid.ToString()
が存在するということは、この変換が必要になるたびに呼び出されるのではないでしょうか?
myInstance.ToString()
この変換が自動的に行われる状況と、明示的に呼び出す必要がある場合を教えてください。
つまり、暗黙的または明示的な変換演算子が定義されている場合:
class WithImplicit {
public static implicit operator string(WithImplicit x) {
return x.ToString();}
}
class WithExplicit {
public static explicit operator string(WithExplicit x) {
return x.ToString(); }
}
class WithNone { }
class Program {
static void Main() {
var imp = new WithImplicit();
var exp = new WithExplicit();
var none = new WithNone();
string s1 = imp;
string s2 = (string)exp;
string s3 = none.ToString();
}
}
ToString() を実際に自分で呼び出す必要がない唯一の場所は、文字列を連結するときです。
Guid g;
int i;
string s = "Hello "+g+' '+i;
次に、 String.Format()など、.NET Framework によって呼び出しが行われる状況がいくつかあります。
それ以外では、コンパイラは、互換性があることがわかっている場合にのみ型を変換します (たとえば、基本クラス、インターフェイスの実装、または明示的にコード化された変換演算子を介して)。キャストを使用し、コンパイラが型に互換性がないことを認識している場合 (たとえば、同じ継承行になく、インターフェイスではない)、変換できないことも伝えます。ジェネリック型パラメーターについても同様です。
いいえ、 からGUID
への暗黙的な変換はないString
ため、コードのどこでも機能しません。
明示的な変換がある場合にのみ機能しますが、変換はあまり目立たない場合があります。たとえば、文字列を連結する場合:
string id = "--" + guidValue + " : " + num;
GUID
これは からへの暗黙的な変換のように見えるかもしれString
ませんが、そうではありません。実際に生成されるコードは次のようになります。
string id = String.Concat(new object[] { "--", guidValue, " : ", num });
すべてのオペランドは型にキャストさObject
れ、配列に配置されます。次に、メソッドは配列内の各項目String.Concat
のメソッドを呼び出して、ToString
それらの文字列表現を取得します。