我试图将浮点值作为输入,如果跳过一个值只是将其设置为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);
}
答案 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中所述。
由于float
,int
和a 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
}