相关疑难解决方法(0)

编译时间错误和无法访问的代码

好的,请考虑以下代码:

private const int THRESHHOLD = 2;

static void Main(string[] args)
{
     string hello;

     if (THRESHHOLD > 1) return;
     Console.WriteLine(hello);        
}
Run Code Online (Sandbox Code Playgroud)

令人惊讶的是,这段代码没有抛出" 使用未分配的局部变量'hello' "编译时错误.它只是发出警告" 检测到无法访问的代码 ".

即使代码无法访问,它仍然是编译时错误,我认为正确的做法是抛出编译时错误.如果我要做以下事情:

private const int THRESHHOLD = 2;

static void Main(string[] args)
{
     string hello;

     if (THRESHHOLD > 1) return;
     hello.LMFAO();       
}
Run Code Online (Sandbox Code Playgroud)

果然,我得到一个" '字符串'不包含'LMFAO'的定义,并且没有扩展方法'LMFAO'接受类型'string'的第一个参数可以找到(你是否缺少using指令或汇编引用? ) "编译时错误.

为什么使用未分配的变量不一样?

编辑改变了const变量,使其不那么分散注意力.我想许多人都忽略了问题的重点,这取决于哪种情况,编译时错误优先于无法访问的代码.

c#

8
推荐指数
2
解决办法
715
查看次数

“使用未分配的局部变量”在带有 TryParse 的 if 语句中使用动态

我刚刚在 VS2015 .Net v4.5.2 控制台应用程序中输入了以下代码:

dynamic fromString = "blah", toString = "blah2";
DateTime fromDate, toDate;
if (DateTime.TryParse(fromString.ToString(), out fromDate) && DateTime.TryParse(toString.ToString(), out toDate)) {
    Console.WriteLine(fromDate);
    Console.WriteLine(toDate); 
}
Run Code Online (Sandbox Code Playgroud)

出乎意料的是,我收到错误“使用未分配的局部变量 toDate”。我没想到,因为只有在从第二个 TryParse 中为“toDate”分配了一个值时,才会输入 if 语句。

不用说,它可以通过为 'toDate' 分配一个值来解决:

DateTime fromDate, toDate = DateTime.MinValue;
Run Code Online (Sandbox Code Playgroud)

或者将 && 更改为 & 以便无论第一次失败如何都会执行两个 TryParses。

但是,我想知道为什么会发生错误?如果变量 fromString 和 toString 是字符串,则不会发生错误并且编译器不会给出 toDate 未分配的错误。因此我想知道为什么编译器对待stringdynamic.ToString()不同?

c# .net-4.5.2

7
推荐指数
2
解决办法
1746
查看次数

标签 统计

c# ×2

.net-4.5.2 ×1