C# 3.0 无法从';外双';至';输出双精度';
我正在编写的应用程序中有以下代码部分:C# 3.0 无法从';外双';至';输出双精度';,c#-3.0,C# 3.0,我正在编写的应用程序中有以下代码部分: ... String[] Columns = Regex.Split(CurrentLine, Delimeter); Nullable<Double> AltFrom; ... if (AltFrom == null) { Double.TryParse(Columns[LatIndex].Trim(), out AltFrom); } ... 。。。 Strin
...
String[] Columns = Regex.Split(CurrentLine, Delimeter);
Nullable<Double> AltFrom;
...
if (AltFrom == null)
{
Double.TryParse(Columns[LatIndex].Trim(), out AltFrom);
}
...
。。。
String[]Columns=Regex.Split(CurrentLine,Delimeter);
可为空的AltFrom;
...
if(AltFrom==null)
{
Double.TryParse(列[LatIndex].Trim(),out AltFrom);
}
...
if子句中的行将不会编译并显示错误:无法从'out double'转换为'out double'
如果我不是从一个可为null的类型生成alt,而是显式地将其声明为Double,那么一切都很好
这肯定是有效的代码。这只是c#中的一个错误,还是我做错了什么?首先,您不能隐式地将
double?
转换为double
。原因是如果double?
表示null
值(即value.HasValue
为false),那么double的值是多少?也就是说,从double?
转换为double
会导致信息丢失(这是一种缩小转换)。隐式缩小转换在框架中通常是不受欢迎的
但实际上,你在这里看到的问题是不同的。当您有一个方法接受类型为T
的out
参数时,必须传入类型为T
的变量;这种情况下不能有任何类型变化,因为存在非ref
和非out
参数
要解决问题,请使用以下方法:
if (AltFrom == null) {
double value;
Double.TryParse(Columns[LatIndex].Trim(), out value);
AltFrom = value;
}
不,out参数确实需要是一个双精度的
,而不是一个可为空的
实际上,因为它是一个out参数,所以将它初始化为0是没有意义的。@Dave,同意。“out”表示必须在方法中指定参数。我想好习惯很难改变。你的逻辑是有道理的,但我认为你的方法是错误的。我不是从替身转换过来的?加倍。我正在从字符串转换为双精度?哪个应该导致double到double的内部转换?如果双倍?如果保留空值(或任何其他值),则与此无关,因为它是out参数,因此将被覆盖。不,我没有将其向后保留。您已将AltFrom
声明为Nullable
,并将其作为out
参数传递给Double.TryParse
。但是,Double.TryParse
需要一个out Double
。因此,您正在传递一个输出双精度?
其中double。TryParse
需要一个输出双精度。正如我提到的,out参数不能与其声明的类型不同。时期
double? altFrom = null;
double temp = 0;
if (double.TryParse( Columns[LatIndex].Trim(), out temp))
{
altFrom = temp;
}