型 'X' を 'string' に暗黙的に変換できません - いつ、どのようにして「できない」と判断するのでしょうか?
-
09-09-2019 - |
質問
今、私はそれを楽しんでいます 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();
}
}
他のヒント
いいえ、GUID
するString
からの暗黙の型変換は、ありません。
明示的な変換がある場合にのみ動作しますが、変換は非常に表示されない場合があります。たとえば、あなたは、文字列を連結するときます:
string id = "--" + guidValue + " : " + num;
このはGUID
するString
からの暗黙的な変換のように見えるかもしれないが、そうではありません。実際に生成されたコードは次のようになります:
string id = String.Concat(new object[] { "--", guidValue, " : ", num });
すべてのオペランドがタイプObject
にキャストし、アレイ状に配置されています。 String.Concat
方法は、それらの文字列表現を取得するには、アレイ内の各項目についてToString
メソッドを呼び出します。
実際に ToString() を自分で呼び出す必要がない唯一の場所は、文字列を連結するときです。
Guid g;
int i;
string s = "Hello "+g+' '+i;
次に、.NET Framework によって呼び出しが行われる状況がいくつかあります。 文字列.フォーマット().
それ以外では、コンパイラは、互換性があることがわかっている場合にのみ型を変換します (例:基本クラス、インターフェイスの実装、または明示的にコード化された変換演算子経由)。キャストを使用し、型に互換性がないことをコンパイラが認識している場合 (例:同じ継承行内になく、インターフェイス内にもない)場合は、変換できないとも表示されます。ジェネリック型パラメータについても同様です。