c# - 使用未分配参数编译器错误,对于从函数输出参数接收的变量?
问题描述
今天我(错误地)遇到了一个奇怪的编译器错误,我不明白它的原因(可能是编译器问题?)。.Net Framework 4.0 和 Visual Studio 2019 如果重要的话。
确切的错误是“使用未分配的局部变量'值'”在TryParse
. 如果我使用s
或d.s
转换为字符串,代码编译得很好。
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 类型。
推荐阅读
- r - 如何使用 tidyverse 将我的数据框分成 10 行?
- xamarin.forms - IOS 中的 Xamarin 表单选择器不会换行
- .net - 如何更改 .Net Framework 的运行时版本
- sql-server - SQL Server 导出向导正在将所有数据更改为 nvarchar
- java - 我将 hibernate-validator 升级到版本 6.1.5,应用程序在 WAS 8.5.5.17 上不起作用
- python - 根据数据框中的数据创建新变量,忽略 NaN
- asp.net-core - 无法从控制器操作刷新页面(ASP.NET MVC 核心)
- reactjs - 子组件中的useSelector重新渲染父组件
- excel - 从单元格中选择和激活超链接的宏
- json - JSON API 调用:分页循环 - 无法增加偏移值