如何将null转换为默认值(float)或0

时间:2016-10-11 10:00:06

标签: c#

我试图将浮点值作为输入,如果跳过一个值只是将其设置为0但是由于skip将其设置为null,我得到一个异常。所以,我尝试使用" ??"像这样的运算符:

float speed = Convert.ToSingle(Console.ReadLine()) ?? default(float);

float speed = Convert.ToSingle(Console.ReadLine()) ?? 0;

但是我收到了一个错误:

  

错误CS0019:操作员' ??'不能应用于类型的操作数   '浮动'和' int'

我将如何编写相应的内容:float y = x ?? 0;

public static void CalculateDistanceTimeSpeed()
{
    Console.WriteLine("Find distance/speed/time based on any of the two.");
    Console.WriteLine("Enter two of the three requirements");
    Console.WriteLine();

    Console.WriteLine("Enter speed in km/h (Enter 0 if unkown)");
    float speed = Convert.ToSingle(Console.ReadLine());

    Console.WriteLine("Enter distance in km (Enter 0 if unkown)");
    float distance = Convert.ToSingle(Console.ReadLine());

    Console.WriteLine("Enter time in hour/s (Enter 0 if unkown)");
    float time = Convert.ToSingle(Console.ReadLine());

    Console.WriteLine(distance, speed, time);

    if (speed == 0)
    {
        speed = distance / time;
        speed.ToString("0.##");

        Console.WriteLine("Determined Average speed : {1}km/h, based on distance: {0}km and time: {2}hrs.", distance, speed, time);
    }

    else if (distance == 0)
    {
        distance = time / speed;
        distance.ToString("0.##");

        Console.WriteLine("Determined distance traveled : {0}km, based on speed: {1}km/h and time: {2}hrs.", distance, speed, time);

    }

    else
    {
        time = distance / speed;
        time.ToString("0.##");

        Console.WriteLine("Determined time traveled: {2}hrs, based on speed: {1}km/h for distance: {0}km.", distance, speed, time);
    } 

7 个答案:

答案 0 :(得分:4)

如果格式未知,

Convert.ToSingle()将抛出异常,它永远不会返回null。您应该使用Single.TryParse()轻松检查结果是否正确。

float speed;
if (!Single.TryParse(Console.ReadLine(), out speed))
    speed = 0f;

另请注意,这些方法将使用当前区域设置,以便它们可以在不同的区域设置上以不同方式接受输入。如果预期输入具有特定区域设置(例如小数分隔符)

,请确保指定正确的区域设置

答案 1 :(得分:2)

回答你的问题:

  

我怎么写相当于:float y = x ?? 0

float? x = 10f;
float y = x ?? 0f;

答案 2 :(得分:1)

您需要使用0f告诉编译器您的0是float而不是int

有关详细信息,请参阅MSDN

答案 3 :(得分:1)

您不能将null合并运算符与值类型(here除外)一起使用,只能使用可以为null的引用类型。但是,你可以使用这个单行:

float speed =  Single.TryParse(Console.ReadLine(), out speed) ? speed : default(float);

答案 4 :(得分:0)

你做不到。 由于Convert.ToSingle()返回float而非float?,结果永远不会null

答案 5 :(得分:0)

已经发布了有效的答案,但我想提供一些背景知道这个错误error CS0019: Operator ??' cannot be applied to operands of type 'float' and 'int'出现的原因是恰当的。

在C#中,我们有引用类型和值类型。差异是

  

引用类型的变量存储对其数据(对象)的引用,而值类型的变量直接包含它们的数据。

MSDN中所述。

由于floatinta couple more类型实际上是值类型,因此很明显为什么不能对这些类型使用null-coalescing operator。它们根本不能是null,因为它们不存储任何引用(可能是null),而是自身值。

答案 6 :(得分:0)

那很有用。多谢你们。这个解决方案对我有用,万一有人好奇。

public static void CalculateDistanceTimeSpeed()
{
    float speed;
    float distance;
    float time;

    Console.WriteLine("Find distance/speed/time based on any of the two.");
    Console.WriteLine("Enter two of the three requirements");
    Console.WriteLine();

    Console.WriteLine("Enter speed in km/h");
    if (!Single.TryParse(Console.ReadLine(), out speed))
        speed = 0f;

    Console.WriteLine("Enter distance in km");
    if (!Single.TryParse(Console.ReadLine(), out distance))
        distance = 0f;

    Console.WriteLine("Enter time in hour/s");
    if (!Single.TryParse(Console.ReadLine(), out time))
        time = 0f;

    if (speed == 0f)
    {
        speed = distance / time;
        Console.WriteLine("Required average Speed : {1}km/h for distance {0}km and time {2}hrs.", distance, speed.ToString("0.##"), time);
    }

    else if (distance == 0f)
    {
        distance = speed * time;
        Console.WriteLine("Distance traveled : {0}km at speed {1}km/h for {2}hrs.", distance.ToString("0.##"), speed, time);

    }

    else
    {
        time = distance / speed;
        Console.WriteLine("Travel time: {2}hrs with speed {1}km/h for distance {0}km.", distance, speed, time.ToString("0.##"));
    } 

    // add mph conversion
}