Kommentar
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
Det går inte att fastställa typen av villkorsuttryck eftersom det inte finns någon implicit konvertering mellan "type1" och "type2".
Det här felet uppstår när kompilatorn inte kan fastställa typen av villkorsuttryck eftersom de två möjliga returvärdena inte har någon implicit konvertering mellan sig. Detta kan inträffa med klasser, värdetyper eller andra typer där det inte finns någon gemensam typ som båda kan konverteras implicit till.
Från och med C# 9 tillåter måltypade villkorsuttryck att kompilatorn använder måltypen (den typ som tilldelas till) för att lösa tvetydighet i vissa fall. CS0173 inträffar dock fortfarande när du använder var eller när det inte finns någon måltyp som vägleder kompilatorn.
För att lösa CS0173 kan du:
Ange en explicit måltyp (tillgänglig i C# 9+):
object result = condition ? value1 : value2; // Works in C# 9.0+Använd explicit gjutning:
var result = condition ? (object)value1 : (object)value2;Se till att det finns en implicit konvertering mellan typerna genom att lägga till konverteringsoperatorer eller använda kompatibla typer.
Mer information finns i Användardefinierade konverteringsoperatorer och Inbyggda numeriska konverteringar.
Exempel
Exempel 1: CS0173 med var (alla C#-versioner)
I följande exempel genereras CS0173 eftersom var det inte finns någon måltyp som kompilatorn kan använda:
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";
}
}
Åtgärda detta genom att ange en explicit typ:
// 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";
Exempel 2: Exempel på klasskonvertering
I följande exempel visas CS0173 med anpassade klasser:
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+.
}
}
Exempel 3: Versionsskillnader med nullbara typer
Beteendet för villkorsuttryck har utvecklats i C#-versioner:
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;
}
}
Anmärkning
Från och med C# 9 tillåter måltypade villkorsuttryck kompilatorn att använda typen av tilldelningsmålet för att lösa typtvetydighet. I tidigare versioner kan du se felet CS8957 i stället för CS0173 när du använder språkfunktioner som inte är tillgängliga i den aktuella språkversionen.