C# c 8.0开关表达式返回类型和空值

C# c 8.0开关表达式返回类型和空值,c#,c#-8.0,switch-expression,C#,C# 8.0,Switch Expression,我试图理解C8.0开关表达式是如何工作的,我有几个问题 为什么在默认情况下不能使用null值?编译器抛出无法将null转换为“int”,因为这是一个不可为null的值类型错误。 为什么它试图将null值转换为int,而函数的返回类型是“double”? 下面是我正在使用的函数: public static double? SwitchFunction(int x) => x switch { 1 => 1, _ => null

我试图理解C8.0开关表达式是如何工作的,我有几个问题

为什么在默认情况下不能使用null值?编译器抛出无法将null转换为“int”,因为这是一个不可为null的值类型错误。 为什么它试图将null值转换为int,而函数的返回类型是“double”? 下面是我正在使用的函数:

public static double? SwitchFunction(int x) =>
    x switch
    {
        1 => 1,
        _ => null
    };

在开关表达式中,所有可能的值都必须隐式可转换为同一类型。因为您的第一个案例是1=>1,并且您没有将整数文本强制转换为int以外的类型,所以其他案例也将假定为int。你需要投1到2倍?若要让编译器将其余的情况解释为double?,一种可为null的类型,它将解决您的两个问题。

在开关表达式中,所有可能的值都必须隐式可强制转换为相同的类型。因为您的第一个案例是1=>1,并且您没有将整数文本强制转换为int以外的类型,所以其他案例也将假定为int。你需要投1到2倍?让编译器将其余的情况也解释为double?,一种可为null的类型—这将解决您的两个问题。

您遇到了条件表达式中常见的问题

// Compiler Error CS0173
// Type of conditional expression cannot be determined because 
// there is no implicit conversion between 'int' and '<null>'
//
// var d2 = i == 1 ? 1 : null; 

// This works
var d2 = i == 1 ? 1 : (double?) null;

您遇到了条件表达式中常见的问题

// Compiler Error CS0173
// Type of conditional expression cannot be determined because 
// there is no implicit conversion between 'int' and '<null>'
//
// var d2 = i == 1 ? 1 : null; 

// This works
var d2 = i == 1 ? 1 : (double?) null;

我遇到了相同的问题,导致了不同的错误消息:没有找到开关表达式的最佳类型

var isRequired = someIntValue switch
    {
      0 => null,
      1 => false,
      2 => true,
      _ => throw new NotSupportedException(),
    };
我无法理解这个错误信息,直到我阅读了这里的答案。编译器无法确定isRequired的类型。我的意图是布尔?。将代码更改为此会使错误消息消失:

var isRequired = someIntValue switch
    {
      0 => (bool?)null,
      1 => false,
      2 => true,
      _ => throw new NotSupportedException(),
    };
另一方面,我可以告诉编译器我想要什么:

bool? isRequired = someIntValue switch
    {
      0 => null,
      1 => false,
      2 => true,
      _ => throw new NotSupportedException(),
    };

我在GitHub上读到他们打算在将来的版本中解决这个问题。

我遇到了相同的问题,导致了不同的错误消息:没有找到开关表达式的最佳类型

var isRequired = someIntValue switch
    {
      0 => null,
      1 => false,
      2 => true,
      _ => throw new NotSupportedException(),
    };
我无法理解这个错误信息,直到我阅读了这里的答案。编译器无法确定isRequired的类型。我的意图是布尔?。将代码更改为此会使错误消息消失:

var isRequired = someIntValue switch
    {
      0 => (bool?)null,
      1 => false,
      2 => true,
      _ => throw new NotSupportedException(),
    };
另一方面,我可以告诉编译器我想要什么:

bool? isRequired = someIntValue switch
    {
      0 => null,
      1 => false,
      2 => true,
      _ => throw new NotSupportedException(),
    };

我在GitHub上读到,他们打算在将来的版本中解决这个问题。

尝试将切换结果转换为double?。没有一个开关响应是double?类型。这与var x=条件类似?1:空;无法工作,因为编译器不够聪明,无法知道您需要int?值。编译器从第一种情况(返回int值1)推断“int”类型。该开关的结果将仅转换为双精度?从call.var x=条件返回时?1:doublenull;但是会起作用。@JasonInVegas无法将null转换为'double',因为它是一个不可为null的值类型。请尝试将切换结果转换为double?。没有一个开关响应是double?类型。这与var x=条件类似?1:空;无法工作,因为编译器不够聪明,无法知道您需要int?值。编译器从第一种情况(返回int值1)推断“int”类型。该开关的结果将仅转换为双精度?从call.var x=条件返回时?1:doublenull;但是将起作用。@JasonInVegas无法将null转换为“double”,因为它是不可为null的值类型