Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
Het type voorwaardelijke expressie kan niet worden bepaald omdat er geen impliciete conversie is tussen 'type1' en 'type2'.
Deze fout treedt op wanneer de compiler het type voorwaardelijke expressie niet kan bepalen, omdat de twee mogelijke retourwaarden geen impliciete conversie hebben. Dit kan gebeuren met klassen, waardetypen of andere typen waarbij er geen algemeen type is waarnaar beide impliciet kunnen worden geconverteerd.
Vanaf C# 9 kunnen voorwaardelijke expressies met doeltypen het doeltype (het type waaraan wordt toegewezen) door de compiler worden gebruikt om in sommige gevallen dubbelzinnigheid op te lossen. CS0173 vindt echter nog steeds plaats bij het gebruik var of wanneer er geen doeltype is om de compiler te begeleiden.
Als u CS0173 wilt oplossen, kunt u het volgende doen:
Geef een expliciet doeltype op (beschikbaar in C# 9+):
object result = condition ? value1 : value2; // Works in C# 9.0+Gebruik expliciete cast-conversie:
var result = condition ? (object)value1 : (object)value2;Zorg ervoor dat er een impliciete conversie tussen de typen is door conversieoperators toe te voegen of compatibele typen te gebruiken.
Zie Door de gebruiker gedefinieerde conversieoperators en ingebouwde numerieke conversies voor meer informatie.
Voorbeelden
Voorbeeld 1: CS0173 met var (alle C#-versies)
In het volgende voorbeeld wordt CS0173 gegenereerd, omdat var er geen doeltype is voor de compiler die moet worden gebruikt:
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";
}
}
U kunt dit oplossen door een expliciet type op te geven:
// 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";
Voorbeeld 2: Voorbeeld van klasseconversie
In het volgende voorbeeld ziet u CS0173 met aangepaste klassen:
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+.
}
}
Voorbeeld 3: Versieverschillen met null-typen
Het gedrag van voorwaardelijke expressies is veranderd in C#-versies:
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;
}
}
Opmerking
Vanaf C# 9 kunnen met doelgetypeerde voorwaardelijke expressies de compiler het type van het toewijzingsdoel gebruiken om dubbelzinnigheid van het type om te zetten. In eerdere versies ziet u mogelijk fout CS8957 in plaats van CS0173 wanneer u taalfuncties gebruikt die niet beschikbaar zijn in de huidige taalversie.