运算符(*)不能应用于'object'和'double'类型的操作数

运算符(*)不能应用于'object'和'double'类型的操作数

问题描述:

这是我的代码。我不明白是什么问题,但Visual Studio 2008中说,运算符(*)不能应用于'object'和'double'类型的操作数

运算符(*)不能应用于类型“对象”的操作数和 “双师型”

谢谢...

#region Using directives 

using System; 
using System.Collections.Generic; 
using System.Text; 

#endregion 

namespace DailyRate 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      (new Program()).run(); 
     } 

     public void run() 
     { 
      double dailyRate = readDouble("Enter your daily rate: "); 
      int noOfDays = readInt("Enter the number of days: "); 
      writeFree(CalculateFee(dailyRate, noOfDays)); 
     } 

     private void writeFree(object p) 
     { 
      Console.WriteLine("The consultant's fee is: {0}", p * 1.1); 
     } 

     private double CalculateFee(double dailyRate, int noOfDays) 
     { 
      return dailyRate * noOfDays; 
     } 

     private int readInt(string p) 
     { 
      Console.Write(p); 
      string line = Console.ReadLine(); 
      return int.Parse(line); 
     } 

     private double readDouble(string p) 
     { 
      Console.Write(p); 
      string line = Console.ReadLine(); 
      return double.Parse(line); 
     } 
    } 
} 

十六到目前为止的答案和他们十五告诉你做错事

首先,大家都告诉你,你不能用一个双乘的对象。 但解决方法是不乘以双倍乘双!您正在做金融的计算; 从不使用双打进行财务计算。双打是物理问题,而不是问题。

正确的事情做的是停止在第一时间使用双打。您应该使用decimal,而不是double

(而当你解决这个问题:在C#的标准是CapitalizeYourMethodsLikeThis,notLikeThis。)

+0

这是哦,所以,重要的一点信息。埃里克的答案通常不需要额外的重量,但我经常看到这一点;浮点数用于表示货币价值。 *坏*! – 2012-03-28 17:28:41

+2

@AndrewBarber:实际上这个问题并没有用*浮点*来表示货币,因为使用*二进制浮点数*而不是*十进制浮点数*。毕竟,你不可能处理的资金数额如此之​​大,以至于这个点的浮动性质将会很重要。问题在于二进制浮点数不能准确表示在处理金钱时可能出现的值(这些值是我们的基数10直觉告诉我们的确切值)。此外,四舍五入的规则不太可能做你想要的货币价值。 – 2012-05-03 15:52:34

你要投p为数值型,如果你想在数学运算来使用它。

Console.WriteLine("The consultant's fee is: {0}", ((double)p) * 1.1); 

因为它看起来像您期望通过一个双到writeFree,它会更有意义宣布适当类型p那里。

private void writeFree(double p) 

这将消除对投射操作的需要。

使用

Console.WriteLine("The consultant's fee is: {0}", (double) p * 1.1); 

这是你writeFee方法无法编译。你不能将一个object与一个数字相乘,编译器不知道如何 - 一个对象可以是任何东西,也可能不是一个数字。在你的代码

private void writeFree(double p) 
{ 
    Console.WriteLine("The consultant's fee is: {0}", p * 1.1); 
} 

private void writeFree(object p) 
{ 
    Console.WriteLine("The consultant's fee is: {0}", p * 1.1); 
} 

P是一个对象,编译器不知道如何:

在这种情况下,解决方法很简单,只是声明writeFee参数为双乘以一个对象和一个double。

private void writeFree(double p) 
{ 
    Console.WriteLine("The consultant's fee is: {0}", p * 1.1); 
} 

只要你用双打来调用函数,就会工作。

对于object没有*运营商。由于某些未知原因,您的方法需要object。在我看来,它应该采取数值。因此:

A)更改writeFree方法以采用适当的数字类型,或 B)在乘数前将对象转换为适当的数字类型。

当然,鉴于你对我们的例子中,选项B是真的只是一个穷人版的选项A.

的...

因此,与选项A.

考虑去这样的:

writeFree("Uh oh!"); 

什么,你会期望得到的"Uh oh!" * 1.1结果呢?如果您的代码编译,这将是合法的。

你需要或者投P作为double

Console.WriteLine("The consultant's fee is: {0}", (double)p * 1.1); 

或更改writeFree接受double,它会工作,它也是情理之中的事,因为这样你CalculateFee已经返回double

private void writeFree(double p) 
    { 
     Console.WriteLine("The consultant's fee is: {0}", p * 1.1); 
    } 

尝试

Console.WriteLine("The consultant's fee is: {0}", Double.Parse(p) * 1.1); 

这样写:

Console.WriteLine("The consultant's fee is: {0}", ((double)p * 1.1)); 

p这条线是object一个doulbe。不能乘以objectdouble

变化:

private void writeFree(object p) 
    { 
     Console.WriteLine("The consultant's fee is: {0}", p * 1.1); 
    } 

要:

private void writeFree(double p) 
    { 
     Console.WriteLine("The consultant's fee is: {0}", p * 1.1); 
    } 

由于您目前它写,编译器认为你试图通过1.1乘的对象,它不知道如何去做。

你的问题就出在这个方法:

private void writeFree(object p) 
{ 
    Console.WriteLine("The consultant's fee is: {0}", p * 1.1); 
} 

会需要修改方法的签名,所以它知道pdouble,或投下pdouble

private void writeFree(double p) 
{ 
    Console.WriteLine("The consultant's fee is: {0}", p * 1.1); 
} 

private void writeFree(object p) 
{ 
    Console.WriteLine("The consultant's fee is: {0}", (double)p * 1.1); 
} 

关于林e:

Console.WriteLine("The consultant's fee is: {0}", p * 1.1); 

您应该将p(它是一个对象)转换为double或其他数值类型。

希望有所帮助。

Console.WriteLine("The consultant's fee is: {0}", p * 1.1); 

p是一个对象(请参阅方法签名)。如果你知道什么类型的,那么你可以简单地投

Console.WriteLine("The consultant's fee is: {0}", (double)p * 1.1); 

我已经做了双有,但你可以使用浮动,诠释等,如果你不知道是什么类型,那么你就需要做一些简单的使用“as”或“is”/ typeof等进行类型检测。

问题是,您无法将object乘以double。从代码的用法,要改变

private void writeFree(object p) 
{ 
    Console.WriteLine("The consultant's fee is: {0}", p * 1.1); 
} 

private void writeFree(double p) 
{ 
    Console.WriteLine("The consultant's fee is: {0}", p * 1.1); 
} 

你不能说你通过数值相乘的对象。
您所要做的就是确保参数是一个数值,因此您必须将函数参数类型更改为数值类型。
请勿在函数中使用(double)强制类型转换,因为如果将非数字参数传递给该函数,会导致奇怪的行为。干净的代码表示始终使用您需要的最具体的类型作为函数参数以避免错误。在你的情况下,它可以是double

你的问题是在WriteFree方法:

private void writeFree(object p) 
    { 
     Console.WriteLine("The consultant's fee is: {0}", p * 1.1); 
    } 

你不能乘对象* 1.1

将其更改为WriteFree(双P)

或者尝试解析P作为双,如果你必须采取对象论证。