次の方法で共有


コンパイラ エラー CS0173

条件式の型は、'type1' と 'type2' の間に暗黙的な変換がないため決定できません。

このエラーは、2 つの可能な戻り値の間に暗黙的な変換がないため、コンパイラが条件式の型を判断できない場合に発生します。 これは、クラス、値型、または両方が暗黙的に変換できる共通型がない他の型で発生する可能性があります。

C# 9 以降では、 ターゲット型の条件式 を使用すると、コンパイラはターゲット型 (割り当てられている型) を使用して、場合によってはあいまいさを解決できます。 ただし、CS0173 は、 var を使用するとき、またはコンパイラをガイドするターゲット型がない場合にも発生します。

CS0173 を解決するには、次のことができます。

  • 明示的なターゲット型を指定します (C# 9 以降で使用可能):

    object result = condition ? value1 : value2;  // Works in C# 9.0+
    
  • 明示的なキャストを使用します。

    var result = condition ? (object)value1 : (object)value2;
    
  • 変換演算子を追加するか、互換性のある型を使用して、型間に暗黙的な変換があることを確認します。

詳細については、「 ユーザー定義変換演算子 」および 「組み込みの数値変換」を参照してください。

例示

例 1: var を含む CS0173 (すべての C# バージョン)

次の例では、コンパイラが使用するターゲット型 var 提供されないため、CS0173 が生成されます。

class Program
{
    static void Main()
    {
        // CS0173: Type of conditional expression can't be determined
        // because there is no implicit conversion between 'int' and 'string'.
        var result = true ? 100 : "ABC";
    }
}

これを修正するには、明示的な型を指定します。

// Fix: Use explicit target type (C# 9.0+).
object result = true ? 100 : "ABC";  // OK in C# 9.0+

// Or use explicit casting (all versions).
var result = true ? (object)100 : (object)"ABC";

例 2: クラス変換の例

次の例は、CS0173 とカスタム クラスを示しています。

public class C {}

public class A
{
    // Uncomment to add implicit conversion from C to A.
    //public static implicit operator A(C c)
    //{
    //    return new A();
    //}
}

public class MyClass
{
    public static void F(bool b)
    {
        A a = new A();
        C c = new C();

        // CS0173: No implicit conversion between A and C.
        var result = b ? a : c;

        // Fix: Cast to common base type.
        object result2 = b ? (object)a : (object)c;

        // Or in C# 9.0+, provide target type.
        object result3 = b ? a : c;  // OK in C# 9.0+.
    }
}

例 3: null 許容型に関するバージョンの違い

条件式の動作は、C# バージョン間で進化しています。

class Program
{
    static void Main()
    {
        // This example shows how different C# versions handle the same code.
        
        // In C# 8.0 and earlier: CS8957 (feature not available).
        // In C# 9.0+: Compiles successfully.
        object? result = (1 == 0) ? null : null;
    }
}

C# 9 以降では、ターゲット型の条件式を使用すると、コンパイラは代入ターゲットの型を使用して型のあいまいさを解決できます。 以前のバージョンでは、現在の言語バージョンでは使用できない言語機能を使用すると、CS0173 ではなく CS8957 エラーが表示されることがあります。