对于从函数输出参数接收的变量,使用未分配的参数编译器错误?
Use of unassigned parameter compiler error, for a variable received from a function out parameter?
今天我(错误地)遇到了一个奇怪的编译器错误,我不明白它的原因(也许是编译器问题?)。 .Net Framework 4.0 和 Visual Studio 2019(如果重要的话)。
确切的错误是 TryParse
之后的 if 中的“使用未分配的局部变量 'value'”。
如果我使用 s
或将 d.s
转换为 string.
,代码编译得很好
using System;
using System.Dynamic;
namespace TestConsoleApp
{
static class Program
{
static void Main(string[] _)
{
string s = "1";
dynamic d = new ExpandoObject();
d.s = s;
if (d.s != null && int.TryParse(d.s, out int value))
{
if (value == 1)
{
Console.Out.WriteLine("OK!");
}
}
}
}
}
乍一看,它像是一个编译器错误。如果你删除 d.s != null
-check,无论如何它都是不必要的,它会编译正常。但我认为这里的评论解释了这一点:
https://github.com/dotnet/roslyn/issues/39489#issuecomment-546003060
不幸的是,这不是错误,这是由于 C# 中存在 true
/false
运算符造成的。
您可以在 &&
表达式的左操作数下定义一个计算结果为 true
的类型,而不计算 &&
的右操作数,如下所示:
class C {
public static U operator==(C c, C d) => null;
public static U operator!=(C c, C d) => null;
}
class U {
public static U operator &(U c, U d) => null;
public static implicit operator U(bool b) => null;
public static bool operator true(U c) => true;
public static bool operator false(U c) => false;
public void M(C c, object o) {
if (c != null && o is string s) {
s.ToString(); // CS0165: Use of unassigned local variable 's'
}
}
}
当处理动态类型的值时,C# 没有关于该类型的静态信息并且它是重载运算符,因此它假定“更差”- 类型如上面示例中的 U。
今天我(错误地)遇到了一个奇怪的编译器错误,我不明白它的原因(也许是编译器问题?)。 .Net Framework 4.0 和 Visual Studio 2019(如果重要的话)。
确切的错误是 TryParse
之后的 if 中的“使用未分配的局部变量 'value'”。
如果我使用 s
或将 d.s
转换为 string.
using System;
using System.Dynamic;
namespace TestConsoleApp
{
static class Program
{
static void Main(string[] _)
{
string s = "1";
dynamic d = new ExpandoObject();
d.s = s;
if (d.s != null && int.TryParse(d.s, out int value))
{
if (value == 1)
{
Console.Out.WriteLine("OK!");
}
}
}
}
}
乍一看,它像是一个编译器错误。如果你删除 d.s != null
-check,无论如何它都是不必要的,它会编译正常。但我认为这里的评论解释了这一点:
https://github.com/dotnet/roslyn/issues/39489#issuecomment-546003060
不幸的是,这不是错误,这是由于 C# 中存在 true
/false
运算符造成的。
您可以在 &&
表达式的左操作数下定义一个计算结果为 true
的类型,而不计算 &&
的右操作数,如下所示:
class C {
public static U operator==(C c, C d) => null;
public static U operator!=(C c, C d) => null;
}
class U {
public static U operator &(U c, U d) => null;
public static implicit operator U(bool b) => null;
public static bool operator true(U c) => true;
public static bool operator false(U c) => false;
public void M(C c, object o) {
if (c != null && o is string s) {
s.ToString(); // CS0165: Use of unassigned local variable 's'
}
}
}
当处理动态类型的值时,C# 没有关于该类型的静态信息并且它是重载运算符,因此它假定“更差”- 类型如上面示例中的 U。