Tag: c# 7.0

为委托分配本地function

在C#7.0中,您可以声明本地函数,即生活在另一个方法中的函数。 这些本地函数可以访问周围方法的局部变量。 由于局部变量仅在调用方法时存在,我想知道是否可以将一个局部函数分配给一个委托(它可以比这个方法调用寿命更长)。 public static Func AssignLocalFunctionToDelegate() { int factor; // Local function int Triple(int x) => factor * x; factor = 3; return Triple; } public static void CallTriple() { var func = AssignLocalFunctionToDelegate(); int result = func(10); Console.WriteLine(result); // ==> 30 } 它确实有效! 我的问题是:为什么这有效? 这里发生了什么?

为什么C#7 ValueTuples实现了Equals方法而不是double equals操作符?

请考虑以下代码段: var tuple1 = (7, “foo”); var tuple2 = (7, “foo”); var tuple3 = (42, “bar”); Assert.That(tuple1.Equals(tuple2), Is.True); //This passes Assert.That(tuple1.Equals(tuple3), Is.False); //This passes Assert.That(tuple1 == tuple2, Is.True); //This does not compile 前两个断言通过。 第三个不编译。 为什么ValueTuple实现了自定义的Equals方法但没有实现double equals运算符?

使用’== false’而不是否定运算符时,内联变量声明不会编译

请考虑以下代码段: void Foo(object sender, EventArgs e) { if (!(sender is ComboBox comboBox)) return; comboBox.DropDownWidth = 100; } 相比 void Bar(object sender, EventArgs e) { if ((sender is ComboBox comboBox) == false) return; comboBox.DropDownWidth = 100; } 包括Foo()代码在.Net 4.6.1中成功编译,而包含Bar()代码导致Use of unassigned local variable ‘comboBox’ 。 在没有讨论使用== false而不是使用否定运算符的原因的辩论中,有人可以解释为什么编译而另一个不编译?

C#7编译器错误 – 模式匹配

由于某种原因, M1()导致编译器错误,而执行相同操作的M2()不会导致错误。 知道为什么吗? 使用false ==应该与使用not运算符相同, ! 。 使用未分配的局部变量’i’ class Program { static void Main(string[] args) { int x = 8; M1(x); M2(x); } // Main() public static void M1(Object obj) { if (false == (obj is int i)) // Causes ERROR on WriteLine return; System.Console.WriteLine(i); // Use of unassigned local variable ‘i’ } public static […]

在C#7中,我如何“滚动自己的”类似任务的类型与异步一起使用?

C#7中一个较少谈论的function是“通用异步返回类型”,微软将其描述为: 从异步方法返回Task对象可能会在某些路径中引入性能瓶颈。 Task是一个引用类型,因此使用它意味着分配一个对象。 如果使用async修饰符声明的方法返回缓存结果或同步完成,则额外分配可能会成为性能关键代码段中的重要时间成本。 如果这些分配发生在紧密的循环中,它可能会变得非常昂贵。 新语言function意味着除了Task , Task和void之外,异步方法可以返回其他类型。 返回的类型仍必须满足异步模式,这意味着必须可以访问GetAwaiter方法。 作为一个具体示例,ValueTask类型已添加到.NET框架中以使用此新语言function: 这听起来不错,但我不能为我的生活找到任何不仅仅使用库存ValueTask类型的ValueTask 。 我想制作类似自己的任务类型。 具体来说,我想要一个行为类似于Task ,但具有更多function的error handling方式。 这是我在项目中用于functionerror handling的类型: public class Try { public T Data { get; } public Exception Error { get; } public bool HasData => Error == null; public bool HasError => Error != null; public Try(T data) { Data = data; […]

c#7.0中的表达式获取/设置访问器function

我在课堂上有这个代码 private string test; public string Test { get => test; set => test = value; } 但编译器不会让我编译。 它说 CS1043 { or ; expected CS1513 } expected 我正在使用VS 2017并使用MVC 5项目定位.NET FW 4.6 知道为什么它不起作用吗?

非短路布尔运算符和C#7模式匹配

我目前正在编写一个针对.NET 4.7(C#7)的C#应用​​程序。 我尝试使用“is”关键字声明变量的新方法后感到困惑: if (variable is MyClass classInstance)这种方式if (variable is MyClass classInstance) ,但在执行时: if (true & variable is MyClass classInstance) { var a = classInstance; } Visual Studio(我正在使用2017)向我展示Use of unassigned local variable ‘classInstance’的错误Use of unassigned local variable ‘classInstance’ 。 使用短小版本的& ( && )它可以正常工作。 我错过了关于&运营商的一些事情吗? (我知道使用shortcircuting版本更常用,但此时我只是好奇)

在ASP.NET MVC Core项目中使用View内部的C#7function

我已经找到了与此相关的其他问题,但似乎没有一个我正在寻找的东西。 我有一个在ASP.NET Core上运行的网站,其中包含VS2017中的新项目结构。 使用C#7的代码文件function编译正常。 但是,尝试在View中使用这些function会导致一系列有关语法的错误。 我尝试安装Roslyn以便在编译视图时使用它,因为我可以告诉我,Roslyn nuget包2.x及更高版本中提供了C#7function。 但现在我得到明确说明的反馈 错误CS8059:C#6中没有function’输出变量声明’。请使用语言版本7或更高版本。 在过去,我会检查web.config,但是在ASP.NET核心项目中没有web.config,而是根目录中的几乎空的,用于处理来自IIS的请求。 我如何表明我的视图应该用Roslyn编译,因为直到运行时才能完成? 至少我认为这会解决我的问题。 编辑:这个问题与此不重复,正如我在开始时提到的那样,我也在寻找现有的问题。 这是在编译时在您的应用程序中专门启用C#7function,并且仅适用于ASP.NET应用程序。 我正在使用ASP.NET Core,它没有web.config,其中定义了任何编译设置。 另外,我正在尝试为在运行时编译的视图执行此操作,并且可能在不同的系统上。 解: 对于任何感兴趣的人,您必须将Roslyn添加到您的项目中(我知道),但您还必须配置RazorViewEngineOptions以使用指示语言版本的CSharpParseOptions (默认值为6)。 我做过这个,但我做得不对。 我需要将WithLanguageVersion()的结果分配回ParseOptions以替换它们。 services.AddMvc().AddRazorOptions(options => options.ParseOptions = options.ParseOptions.WithLanguageVersion(LanguageVersion.CSharp7));

C#7 ValueTuple编译错误

我正在使用VS2017 RC,我的应用程序以net framework 4.6.1为目标。 我有两个引用System.ValueTuple 4.3的程序集 MyProject.Services MyProject.WebApi 在MyProject.Services中,我有一个类,有这样的方法 public async Task GetAllStatsAsync() { // Some code… return (fCount, cCount, aCount); } 在MyProject.WebApi中,我有一个使用此方法的控制器: public async Task GetInfoAsync() { // Some code… var stats = await _myClass.GetAllStatsAsync(); var vm = new ViewModel { FCount = stats.fCount, CCount = stats.cCount, ACount = stats.aCount }; return Request.CreateResponse(HttpStatusCode.OK, vm); […]