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;
}