Why can't I concatenate int data in C#? [duplicate] - c#

This question already has answers here:
Cannot implicitly convert type 'double' to 'int'. -error
(4 answers)
Closed 9 months ago.
I am a beginner in C#. I'm currently trying to concatenate int data and using the Math square root function, but after running the program, it produces an error.
The code are as follows.
using System;
namespace NewProject
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Type any number");
int number = Convert.ToInt32(Console.ReadLine());
int square_root = Math.Sqrt(number);
Console.WriteLine("$The square root of {square_root} is " , square_root);
}
}
}
C:\Users\ajmal\Documents\Learn C#\New Project\Program.cs(13,31): error CS0266: Cannot implicitly convert type 'double' to 'int'. An explicit conversion exists (are you missing a cast?) [C:\Users\ajmal\Documents\Learn C#\New Project\N
ew Project.csproj]
The build failed. Fix the build errors and run again.
Any tips and help would be appreciated

The compiler message tells:
Cannot implicitly convert type 'double' to 'int'. An explicit conversion exists (are you missing a cast?)
It even gives you the location of the error:
New Project\Program.cs(13,31)
Line 13, position 31
If you look there, not very far you should find this line:
int square_root = Math.Sqrt(number);
If you look that the Math.Sqrt documentation, you'll see that Math.Sqrt returns a double.
Here is the signature from the documentation:
public static double Sqrt (double d);
So you try to put a double into an int (the type of your square_root variable), which is only possible with an explicit cast, hence the compiler message.
To fix this (supposing you want to keep a non integer value for the square root) simply correct the line with
double square_root = Math.Sqrt(number);
or you can even let the compiler do the work by leveraging the var keyword:
var square_root = Math.Sqrt(number);
Additional remarks:
The Math.Sqrt signature shows that a double is needed as parameter, but you pass an int. This is not a problem since the compiler can do an implicit conversion from an int to a double.
There will also be an error on the following line (without even considering the meaning of what you write).
Console.WriteLine("$The square root of {square_root} is " , square_root);
To concatenate strings, you can use several techniques, like composite formating and string interpolation. It seems you mix both synthax on this line.
See the string interpolation documentation:
an example of both methods taken from the documentaion:
string name = "Mark";
var date = DateTime.Now;
// Composite formatting:
Console.WriteLine("Hello, {0}! Today is {1}, it's {2:HH:mm} now.", name, date.DayOfWeek, date);
// String interpolation:
Console.WriteLine($"Hello, {name}! Today is {date.DayOfWeek}, it's {date:HH:mm} now.");
// Both calls produce the same output that is similar to:
// Hello, Mark! Today is Wednesday, it's 19:40 now.

Related

Why is a JValue held in a "dynamic" variable, assignable to a string variable, but not usable when calling a method taking a string parameter?

This comes from this question really: Looping through JSON array and adding items to list C#
.
To not derail that question completely, I ask a new one that I started to wonder about.
Using Json.net, why does this code work:
dynamic test = new JValue("test");
string s = test;
while this:
dynamic test = new JValue("test");
var list = new List<string>();
list.Add(test);
throws:
RuntimeBinderException: The best overloaded method match for 'System.Collections.Generic.List<string>.Add(string)' has some invalid arguments
Given that there is just one overload for the Add method, and it takes a string, why won't it silently do the runtime conversion here as well?
Note that there is nothing specific about list.Add that makes this fail, this also fails:
dynamic test = new JValue("test");
Test(test);
...
public static void Test(string s) { }
First thing I could think of was that JValue has an implicit cast operator to string, but alas:
JValue test = new JValue("test");
string s = test;
does not compile, with:
CS0266 Cannot implicitly convert type 'Newtonsoft.Json.Linq.JValue' to 'string'. An explicit conversion exists (are you missing a cast?)
but it does say an explicit conversion exists, is this what "saves" the direct assignment to a string variable? But then, still, why didn't it save the usage as a parameter value where the only available overload takes a string parameter? Does assignment have extra rules perhaps?
After having thought some more about this I guess this question is actually the wrong question.
dynamic is not supposed to make more things work at runtime than they would at compile time, instead it's just meant to postpone the type binding to runtime.
So changing the type of the variable to a statically typed one, and neither of the examples work:
JValue test = new JValue("test");
string s = test; // CS0266 Cannot implicitly convert type 'Newtonsoft.Json.Linq.JValue' to 'string'. An explicit conversion exists (are you missing a cast?)
JValue test = new JValue("test");
Test(test); // same

Weird behavior of -1U and -1UL [duplicate]

This question already has answers here:
Unsigned Integer Literal Having Negative Sign
(3 answers)
Closed 2 years ago.
I'm currently creating a unit test for a method.
The convert method this is supposed to test basically consists of return if value > 0 so I had the idea to check unsigned overflows as well.
While creating test cases for the test I stumbled upon this very peculiar behavior of the U and UL suffixes.
[DataTestMethod]
// more data rows
[DataRow(-1U, true)] // Technically compiles, but not to what I expected or "wanted"
[DataRow(-1UL, true)] // "CS0023: Operator '-' cannot be applied to operand of type 'ulong'"
// more data rows
public void TestConvertToBool(object value, bool result)
{
// For testing purposes
ulong uLong = -1UL; // "CS0023: Operator '-' cannot be applied to operand of type 'ulong'"
uint uInt = -1U; // "CS0266: Cannot implicitly convert type 'long' to 'uint'. An explicit conversion exists (are you missing a cast?) - Cannot convert source type 'long' to target type 'uint'"
var foo = -1U; // foo is of type 'long'
var bar = 1U; // bar is of type 'uint'
// ... do the actual assertion here
}
Why do they behave this way? Shouldn't it just overflow to the max values of uint and ulong?
I couldn't find any answer to this. The reference source seems to only contain the wrapper objects UInt32 and such that don't include any operators.
Note: I'm aware that there is no real point in doing this in the first place. I just found the behavior to be very unexpected.
It seems that it's converting the uint to a long so that there are always enough bits to store the entire potential range of resulting positive and negative values. The - operator can't be applied to a ulong because there's no larger type to convert it to

Casting keeps on getting errors

I have a CSV with the following data (no header)
12,2010,76.5
2,2000,45
12,1940,30.2
and I'm reading the data into a List<List<object>>.
To know what's in each line and column / row I'm using the following loop
List<List<object>> data = CSVReaderNoHeader.Read("input")
for (var i = 0; i < data.Count; i++)
{
double month = (double)(int)data[i][0];
print($"month:{month} ////END");
double year= (double)(int)data[i][1];
print($"year:{year} ////END");
double temperature= (double)data[i][2];
print($"temperature:{temperature} ////END");
}
Yes I need to create doubles, that's why I'm unboxing and casting (could have use double.Parse instead).
I'm able to print the month and the year just fine, but when reaching double temperature= (double)data[i][2];, throws the following error
InvalidCastException: Specified cast is not valid.
I printed what's in data[i][2] before that line (print(data[i][2]);) just to see if everything was in order there and got 76.5 as expected. Then, tested also using
double temperature= (double)(double)data[i][2];
double temperature= (double)(float)data[i][2];
(which i think it would be unnecessary to add that extra (double) / (float)) and
object tempr = data[i][2];
double temperature;
temperature = (double)tempr;
but the problem remained. So, I went on and ran print(data[i][2].GetType()); to see if the type returned there could be cast into a double. I got as result System.String.
Knowing this, then I tried then the methods double.TryParse, double.Parse and Convert.ToDouble but none worked
double.TryParse(data[i][2], out temperature);
Argument 1: cannot convert from 'object' to string.
double temperature = double.TryParse(data[i][2]);
Argument 1: cannot convert from 'object' to string.
double temperature = System.Convert.ToDouble(data[i][2]);
FormatException: Input string was not in a correct format.
How then I have to cast it?
Because your numbers use a point as decimal separator and your system localization can use a different, you can use that:
using System.Xml;
double temperature = XmlConvert.ToDouble(data[i][2].ToString());
It will raise an exception in case of parsing error.
So you can try...catch to manage it.
Perhaps you will need to add System.Xml to assembly references of the project.
Else you can use #Fabjan solution:
if (double.TryParse(data[i][2].ToString(),
System.Globalization.NumberStyles.Any,
System.Globalization.CultureInfo.InvariantCulture,
out var temperature);
IsOk();
else
IsNotOk();

Getting Error When Converting from Decimal to Double in C#

I got an error and I don't know why. I dont find the need to convert to double or am i supposed to to that? I am really confused right now
Argument 1: cannot convert from 'decimal' to 'double'
static void Main(string[] args)
{
Console.Write("speed: ");
string speed = Console.ReadLine();
Console.Write("Gammafaktor: ");
string Gammafaktor = Console.ReadLine();
{
}
var gamma1 = Convert.ToDecimal(Gammafaktor);
var speed1 = Convert.ToDecimal(speed);
if ( speed1 !=0 )
{
var calc = 1m / Convert.ToDecimal(Math.Sqrt(1 - speed1 * speed1));
Console.WriteLine(calc);
}
}
}
}
You are most likely seeing:
CS1503 Argument 1: cannot convert from 'decimal' to 'double'
on the line with the Math.Sqrt call, or (if you move the assignment out to a local):
CS0266 Cannot implicitly convert type 'decimal' to 'double'. An explicit conversion exists (are you missing a cast?)
Math.Sqrt takes a double, not a decimal, and the conversion from decimal to double is explicit, not implicit - meaning it isn't going to just do it automatically without you knowing about it; so:
var calc = 1m / Convert.ToDecimal(Math.Sqrt((double)(1 - speed1 * speed1)));
As a side note... that calculation looks very odd (and dangerous), unless speed1 is always between zero and one.

cannot implicitly convert type 'string' to 'double' [duplicate]

This question already has answers here:
Cannot implicitly convert type 'string' to 'double' Issue
(5 answers)
Closed 8 years ago.
Hi guys I am trying to use set a text box to only accept double data types as the type of input to be accepted for product price but im getting the following error: cannot implicitly convert type 'string' to 'double'. Can anyone point in me in the right direction please?
((Employee)o).ProdPrice = this.textProdName.Text;
I am getting the eror under this.textProdName.Text.
I prefer TryParse, because if the string can't be parsed, I can decide on what value to return, in the sample below I used Doube.NaN.
Double val;
((Employee)o).ProdPrice = Double.TryParse(this.textProdName.Text, out val)?val:Double.NaN;
Try Convert.toDouble or Double.Parse
so like this: ((Employee)o).ProdPrice = Convert.ToDouble(this.textProdName.Text); or ((Employee)o).ProdPrice = Double.Parse(this.textProdName.Text);
I am trying to use set a text box to only accept double data types as the type of input to be accepted for product price
Assuming that you already validate the textbox to only accept double values, you need to convert this.textProdName.Text to double
((Employee)o).ProdPrice = Convert.ToDouble(this.textProdName.Text);
However, in case the textbox can't be converted to double, use Double.TryParse as below
Double prodPrice = 0;
if (Double.TryParse(this.textProdName.Text, out prodPrice))
{
((Employee)o).ProdPrice = prodPrice;
}
else
{
// do something when textProdName.Text can't be converted to double
}

Categories

Resources