如何将 csharp 8 代码转换为早期版本

how to convert csharp 8 code to earlier version

我需要更改此代码以在早期版本的 c# 上工作 在下面的代码中如何改变这样的条件

if (value is TimeSpan ts)

更早的 c# ?

string parsedValue;
bool parsed;

if (value == DateTime d && d >= BaseDate)
{
    parsedValue = d.ToOADate().ToInvariantString();
    parsed = true;
    SetDateTimeFormat(style, d.Date == d);
}
else if (value is TimeSpan ts)
{
    parsedValue = ts.TotalDays.ToInvariantString();
    parsed = true;
    SetTimeSpanFormat(style);
}
else if (value is Boolean b)
{
    parsedValue = b ? "1" : "0";
    _dataType = XLDataType.Boolean;
    parsed = true;
}

同样在下面的代码中

private static Boolean TryGetBasicValue<T, U>(String currentValue, ParseFunction<U> parseFunction, out T value)
{
    if (parseFunction.Invoke(currentValue, NumberStyles.Any, null, out U result))
    {
        value = (T)Convert.ChangeType(result, typeof(T).GetUnderlyingType());
        return true;
    }

    value = default;
    return false;
}

如何更改 C# 7

value = default; 

到早期的 C# 代码?

C# 7: is operator pattern or Is-expression with pattern

Reference

if (value is TimeSpan ts)

C# 3: is and as 运算符

Reference 1, 2

TimeSpan? ts = value as TimeSpan?;
if (ts.HasValue) 
   ...

if (value is TimeSpan) 
   TimeSpan ts = (TimeSpan)value;

C# 7:默认文字

Reference

value = default;

C# 3: 默认运算符

Reference

value = default(T);

表达式 value is TimeSpan ts 检查 value 的运行时类型,如果其类型为 TimeSpan,则将该值复制到 ts 变量中。装箱的值类型将在复制过程中取消装箱。

请注意,System.TimeSpan 可能是您在此处处理的类型,它是一种值类型,因此 as 兼容return 引用类型所必需的运算符(以便在类型不正确时它可以 return null)。

因此在您的示例中,您需要检查类型然后显式地拆箱值,如下所示:

...
else if (value is TimeSpan)
{
    TimeSpan ts = (TimeSpan)value;

    parsedValue = ts.TotalDays.ToInvariantString();
    parsed = true;
    SetTimeSpanFormat(style);
}
...

第二个更简单,因为 default 可以用 default(T) 代替。例如。 value = default(T);.