Tag: c# 7.0

任何原因tu使用C#7元组返回值的参数?

我刚看了一段video,展示了C#7的新function 。 其中,它引入了返回元组类型的可能性(例如: (int, int) ,我相信,它只是Tuple的语法糖)。 因此,如果我们有一个返回多个值的方法,C#中有3种可能的方法: (int first, int second) ReturnTuple() { return (1, 2); } int ReturnOutParam(out int second) { second = 2; return 1; } CustomObject ReturnObject() { return new CustomObject { First = 1, Second = 2 }; } 我相信,没有更多的方法可以做到 – 如果是的话,请纠正我。 这三种方法中的哪一种是正确的? 在哪些情况下我们可以使用其余的两个? 对于每一个新的C#版本,我都觉得有一两种设计模式在.NET世界中已经过时了。 一些function非常有用(如generics,部分,LINQ,lambdas,async / await或null传播器)。 其他人非常情绪化(动态,名称)。 然后还有那些对我没有意义的东西(属性自动初始化器,元组返回值或本地函数)。

如何在Web应用程序ASPX代码页面之前使用C#7?

(这是我的问题“ 如何使用C#6与网站项目类型? ”的后续行动) 我正在尝试在Visual Studio 2017中使用C#7function。 为此,我在现有的ASP.NET WebForms 4.6.2应用程序中将Microsoft.Net.Compilers NuGet包更新到v2.0.0-rc4 。 它似乎从Visual Studio 2017内部运行良好。 当部署到我的网站时,我看到的只是一个黄色的死亡屏幕: 编译错误,错误代码255。 [详细编译输出] 版本信息:Microsoft .NET Framework版本:4.0.30319; ASP.NET版本:4.6.1590.0 完整的编译器源太长了,无法在此发布(超过30k字符), 我已将其上传到Pastebin 。 我的问题: 有没有机会在ASP.NET WebForms Web应用程序中使用最新的Roslyn编译器? 更新1: 当然,我已经包含了Microsoft.CodeDom.Providers.DotNetCompilerPlatform NuGet包和web.config条目, 如此处所述 。 我甚至试图将上面XML中的/langversion:6参数改为/langversion:7 ,没有不同的结果。 更新2: 对于在.cshtml Razor文件中使用ASP.NET MVC视图中的C#7function,问题和答案可能类似。 更新3: 我已经挖掘了事件日志,发现了这些(德国系统,对不起): Anwendung: csc.exe Frameworkversion: v4.0.30319 Beschreibung: Der Prozess wurde aufgrund einer unbehandelten Ausnahme beendet. Ausnahmeinformationen: […]

以编程方式构建msbuild 15项目

我正在尝试构建一个使用VS2017创建的简单C#7类库项目。 框架程序集中的MSBuild已过时,因此我在C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\MSBuild\15.0\Bin MSBuild文件夹中引用Microsoft.Build , Microsoft.Build.Engine和Microsoft.Build.Framework ( C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\MSBuild\15.0\Bin )。 当我这样做时: using (var collection = new ProjectCollection()) { var proj = collection.LoadProject(@”c:\projects\Sample\Sample.csproj”); // <– exception proj.Build(new[] {new ConsoleLogger()}); } 我收到了InvalidProjectFileException: The tools version “15.0” is unrecognized. Available tools versions are “4.0”, “2.0”. InvalidProjectFileException: The tools version “15.0” is unrecognized. […]

VS 2017中的元组语法

在VS2017 RC中,当您尝试使用新的元组语法时,您收到以下错误: CS8179未定义或导入预定义类型’System.ValueTuple`X’ 为了使用元组语法,您必须手动将ValueTuple nuget包导入项目中。 没什么大不了的,因为它是预发布版本,我认为它将在RTM中更改,因此它将默认启用。 不幸的是,在最终版本中仍然如此,您必须为每个项目下载nuget包以使用元组语法。 有没有办法默认为每个项目启用元组语法?

C#7:如何使用元组将对象解构为单个值?

C#7的一个很好的新function是可以为类定义解构器并将解构值直接赋值给值元组。 但是,在将对象解构为单个值的情况下,我找不到将其分配给元组的方法。 虽然元组的类型有单个元素( ValueTuple ),但使用括号的简写语法在这里不起作用。 我发现访问解构器的唯一方法是直接调用Deconstruct方法,但这消除了它的好处,因为我可以使用任何方法来实现这一目的。 有没有人知道将对象解构为单个值的更好方法? 这是我的测试代码: class TestClass { private string s; private int n; public TestClass(string s, int n) => (this.s, this.n) = (s, n); public void Deconstruct(out string s) => s = this.s; public void Deconstruct(out string s, out int n) => (s, n) = (this.s, this.n); } static void Main(string[] […]

可以将名为Tuple的C#用作MVC页面模型类型吗?

在C#7中,您可以使用命名元组: var foo = (Name: “Joe”, Age: 42); 如果我使用以下方法将其传递给MVC模型: return View(foo); 那么应该在cshtml文件中使用什么语法来声明模型? 虽然这不起作用,但像…… @model (string Name, int Age);

使用“is”关键字和“null”关键字c#7.0

最近我发现,以下代码在VS2017中编译并按预期工作。 但我找不到任何关于此的主题/文档。 所以我很好奇使用这种语法是否合法: class Program { static void Main(string[] args) { var o = new object(); Console.WriteLine(o is null); o = null; Console.WriteLine(o is null); Console.ReadLine(); } } 顺便说一句,这在VS2015中无效

使用new创建名称ValueTuple属性

我知道当我创建一个隐式的元组时,我可以命名参数: var me = (age: 21, favoriteFood: “Custard”); 是否可以在明确创建元组时命名参数? 即 var me = new ValueTuple(21, “Custard”);

为什么不通过ref返回集合元素?

以下通过引用返回的示例来自C#7.0中的新function : public ref int Find(int number, int[] numbers) { for (int i = 0; i < numbers.Length; i++) { if (numbers[i] == number) { return ref numbers[i]; // return the storage location, not the value } } throw new IndexOutOfRangeException($"{nameof(number)} not found"); } 编译时没有任何问题(正如您所期望的那样,它是从Microsoft博客中复制的)。 我写过这个: private static ref int GetReference(string searchTerm) { var passwords […]

如何在VS2017 RC中使用新的异步语义?

从Visual Studio 2017 RC发行说明引用 语言扩展和分析器 此版本包括一些我们正在为下一版本的C#和Visual Basic工作的新语言扩展。 默认情况下启用这些新语言function,包括: 对于C#: 异步方法的类似任务的返回类型 :这引入了从异步方法返回任何类似任务类型的能力。 以前这些返回类型被约束为Task和Task 。 它说它默认启用,但我无法让它工作。 甚至从链接的Github页面下载精确的ArbitraryAsyncReturns.zip(并修复对React NuGet包的引用以删除不相关的错误),但是没有安装自定义VSIX包(用于VS2015),我继续得到 错误CS1983:异步方法的返回类型必须为void,Task或Task 我是否需要采取任何额外步骤才能使其正常工作? 我首先尝试将该特定示例缩减为应该起作用的最小版本,但尝试使用它,我还不知道应该起作用什么,不应该起作用。 至少,鉴于这种语言增强,我期待一个虚假的程序,如 struct Test { } static class Program { static async Test Test() { } static void Main() { } } 无法使用不同的错误消息进行编译。 获得相同的错误消息,甚至提示此语言扩展尚未启用,但JaredPar注意到错误消息尚未更新。 我现在将一个所谓的有效示例减少到我认为应该编译的最小版本(但由于未实现的方法而在运行时失败),但是不编译: using System; using System.Runtime.CompilerServices; using System.Threading.Tasks; namespace System.Runtime.CompilerServices { public class TasklikeAttribute […]