型 'X' を 'string' に暗黙的に変換できません - いつ、どのようにして「できない」と判断するのでしょうか?

StackOverflow https://stackoverflow.com/questions/751303

  •  09-09-2019
  •  | 
  •  

質問

今、私はそれを楽しんでいます Guids.

コード全体で、この暗黙的な変換が機能する場所もあれば、機能しない場所もあるということを確かに覚えています。今まではパターンが見えませんでした。

コンパイラは、それができないときをどのように判断するのでしょうか?つまり、型メソッド 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 によって呼び出しが行われる状況がいくつかあります。 文字列.フォーマット().

それ以外では、コンパイラは、互換性があることがわかっている場合にのみ型を変換します (例:基本クラス、インターフェイスの実装、または明示的にコード化された変換演算子経由)。キャストを使用し、型に互換性がないことをコンパイラが認識している場合 (例:同じ継承行内になく、インターフェイス内にもない)場合は、変換できないとも表示されます。ジェネリック型パラメータについても同様です。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top