コンパイラ エラー CS0029Compiler Error CS0029

型 'type' を 'type' に暗黙的に変換できませんCannot implicitly convert type 'type' to 'type'

コンパイラでは、明示的な変換が必要です。The compiler requires an explicit conversion. たとえば、左辺値と同じ型の右辺値をキャストする必要があります。For example, you may need to cast an r-value to be the same type as an l-value. また、特定の演算子のオーバーロードをサポートするための変換ルーチンを指定する必要があります。Or, you must provide conversion routines to support certain operator overloads.

型の変数を別の型の変数に割り当てた場合、変換を行う必要があります。Conversions must occur when assigning a variable of one type to a variable of a different type. 異なる型の変数間で割り当て行うと、コンパイラで代入演算子の右辺の型を代入演算子の左辺の型に変換する必要があります。When making an assignment between variables of different types, the compiler must convert the type on the right-hand side of the assignment operator to the type on the left-hand side of the assignment operator. 次のコードを実行します。Take the following the code:

int i = 50;  
long lng = 100;  
i = lng;  

i = lng; は割り当てを行いますが、代入演算子の左辺と右辺で変数のデータ型が一致しません。i = lng; makes an assignment, but the data types of the variables on the left and right-hand side of the assignment operator don't match. 割り当てを行う前に、コンパイラは long 型の変数 lng を暗黙的に int に変換しています。この変換の実行をコンパイラに明示的に指示するコードがないため、これは暗黙的です。Before making the assignment the compiler is implicitly converting the variable lng, which is of type long, to an int. This is implicit because no code explicitly instructed the compiler to perform this conversion. このコードの問題は、このコードが縮小変換と見なされ、データが失われる可能性があるため、コンパイラが暗黙的な縮小変換を許可しないことです。The problem with this code is that this is considered a narrowing conversion, and the compiler does not allow implicit narrowing conversions because there could be a potential loss of data.

変換元のデータ型よりもメモリに占める記憶域スペースが少ないデータ型に変換するときに、縮小変換が存在します。A narrowing conversion exists when converting to a data type that occupies less storage space in memory than the data type we are converting from. たとえば、long を int に変換すると、縮小変換と見なされます。For example, converting a long to an int would be considered a narrowing conversion. long のメモリ占有スペースは 8 バイトですが、int の占有スペースは 4 バイトです。A long occupies 8 bytes of memory while an int occupies 4 bytes. データ損失の発生状況を確認するには、次のサンプルを参照してください。To see how data loss can occur, consider the following sample:

int i = 50;  
long lng = 3147483647;  
i = lng;  

変数 lng には、大きすぎるため変数 i に格納できない値が含まれています。The variable lng now contains a value that cannot be stored in the variable i because it is too large. この値を int 型に変換しようとすると、データの一部が失われ、変換後の値は変換前の値とは同じになりません。If we were to convert this value to an int type we would be losing some of our data and the converted value would not be the same as the value before the conversion.

拡大変換は縮小変換の逆の処理です。A widening conversion would be the opposite of a narrowing conversion. 拡大変換では、変換元のデータ型よりもメモリに占める記憶域スペースが多いデータ型に変換します。With widening conversions, we are converting to a data type that occupies more storage space in memory than the data type we are converting from. 拡大変換の例を次に示します。Here is an example of a widening conversion:

int i = 50;  
long lng = 100;  
lng = i;  

このコード サンプルと、最初のサンプルの違いに注意してください。Notice the difference between this code sample and the first. 今回、変数 lng は代入演算子の左辺にあるため、割り当ての対象です。This time the variable lng is on the left-hand side of the assignment operator, so it is the target of our assignment. 割り当てを行う前に、コンパイラで int 型の変数 i は long 型に暗黙的に変換される必要があります。Before the assignment can be made, the compiler must implicitly convert the variable i, which is of type int, to type long. メモリの占有スペースが 4 バイトの型 (int) をメモリの占有スペースが 8 バイトの型 (long) に変換するため、これは拡大変換です。This is a widening conversion since we are converting from a type that occupies 4 bytes of memory (an int) to a type that occupies 8 bytes of memory (a long). データ損失の可能性がないため、暗黙の拡大変換は許可されます。Implicit widening conversions are allowed because there is no potential loss of data. int に格納できる値は、long にも格納できます。Any value that can be stored in an int can also be stored in a long.

前述のように、暗黙的な縮小変換は許可されないため、このコードをコンパイルできるようにするには、データ型を明示的に変換する必要があります。We know that implicit narrowing conversions are not allowed, so to be able to compile this code we need to explicitly convert the data type. 明示的な変換にはキャストが使用されます。Explicit conversions are done using casting. キャストとは、あるデータ型を別のデータ型に変換する処理を示すために C# で使用される用語です。Casting is the term used in C# to describe converting one data type to another. コードをコンパイルするには、次の構文を使用する必要があります。To get the code to compile we would need to use the following syntax:

int i = 50;  
long lng = 100;  
i = (int) lng;   // cast to int  

このコードの 3 行目では、割り当てを行う前に、long 型の変数 lng を int に明示的に変換するようにコンパイラに指示しています。The third line of code tells the compiler to explicitly convert the variable lng, which is of type long, to an int before making the assignment. ただし、縮小変換にはデータ損失の可能性がある点に注意してください。Remember that with a narrowing conversion, there is a potential loss of data. 縮小変換を慎重に使用する必要があります。コードをコンパイルできるとしても、実行時に予期しない結果が発生する可能性があります。Narrowing conversions should be used with caution and even though the code will compile you may get unexpected results at run-time.

この問題は値の型のみが対象です。This discussion has only been for value types. 値の型を操作する場合、変数に格納されているデータを直接操作します。When working with value types you work directly with the data stored in the variable. 一方、.NET Framework の場合は参照型もあります。However, the .NET Framework also has reference types. 参照型を操作する場合、実際のデータではなく、変数の参照を操作することになります。When working with reference types you are working with a reference to a variable, not the actual data. 参照型の例として、クラス、インターフェイス、および配列があります。Examples of reference types would be classes, interfaces and arrays. コンパイラが特定の変換を許可している場合、または適切な変換演算子が実装されている場合を除き、ある参照型を別の参照型に暗黙的または明示的に変換することはできません。You cannot implicitly or explicitly convert one reference type to another unless the compiler allows the specific conversion or the appropriate conversion operators are implemented.

次の例では CS0029 が生成されます。The following sample generates CS0029:

// CS0029.cs  
public class MyInt  
{  
    private int x = 0;
  
    // Uncomment this conversion routine to resolve CS0029  
    /*  
    public static implicit operator int(MyInt i)  
    {  
       return i.x;  
    }  
    */  
  
    public static void Main()  
   {  
      MyInt myInt = new MyInt();  
      int i = myInt; // CS0029  
   }  
}  

関連項目See also