Tag: c# 6.0

空传播运算符和扩展方法

我一直在看Visual Studio 14 CTP和C#6.0,并使用空传播操作符。 不过,我找不到为什么下面的代码不能编译。 function尚未logging,所以我不确定这是一个错误还是扩展方法根本不支持?. 操作员和错误信息是误导。 class C { public object Get() { return null; } } class CC { } static class CCExtensions { public static object Get(this CC c) { return null; } } class Program { static void Main(string[] args) { C c = null; var cr = c?.Get(); //this compiles […]

RyuJit产生不正确的结果

在最近升级到.net 4.6之后,我们发现了一个错误,RyuJit产生了不正确的结果,现在我们可以通过在app.config中添加useLegacyJit enabled =“true”来解决这个问题。 我怎样才能debugging由以下产生的机器码? 我在VS 2015 RTM中创build了一个新的控制台项目,设置为释放,任何CPU,未选中首选32位,运行有和没有debugging器连接产生相同的结果。 using System; using System.Runtime.CompilerServices; namespace ConsoleApplication2 { class Program { static void Main(string[] args) { Console.WriteLine(Calculate()); Console.WriteLine(Calculate()); Console.ReadLine(); } [MethodImpl(MethodImplOptions.AggressiveInlining)] public static Value Calculate() { bool? _0 = (bool?)null; bool? _1 = (bool?)true; if (!Value.IsPresent<bool>(_1)) { return default(Value); } bool? result = null; result = (_1.Value ? […]

string插值问题

我想弄清楚为什么我的unit testing失败(下面的第三个断言): var date = new DateTime(2017, 1, 1, 1, 0, 0); var formatted = "{countdown|" + date.ToString("o") + "}"; //Works Assert.AreEqual(date.ToString("o"), $"{date:o}"); //Works Assert.AreEqual(formatted, $"{{countdown|{date.ToString("o")}}}"); //This one fails Assert.AreEqual(formatted, $"{{countdown|{date:o}}}"); AFAIK,这应该正常工作,但它似乎没有正确传递格式参数,它显示为{countdown|o}的代码。 任何想法为什么这是失败?

在C#6中指定string插值的区域设置(Roslyn CTP6)

在C#6中的string插值让我写: decimal m = 42.0m; string x = $"The value is {m}"; 但是,string格式化的一个非常常见的用例是指定用于格式化值的区域设置。 假设我需要使用InvariantCulture进行上面的格式化操作,那么这个语法是什么? 这个讨论表明我应该能够做到这一点: string x = INV($"The value is {m}"); INV被定义为 public static string INV(IFormattable formattable) { return formattable.ToString(null, System.Globalization.CultureInfo.InvariantCulture); } 但是,这不起作用。 它编译,但它启动时离开我的程序挂在cmd.exe – 如果klr.exe,我假设被调用,挂起(编译器错误?) 这是VS15 CTP 6中的ASP.NET 5控制台项目。

为什么在C#6.0中交换内部'finally'和'outer'的执行顺序?

我见过这个例子: static void Main(string[] args) { Console.WriteLine("Start"); try { SomeOperation(); } catch (Exception) when (EvaluatesTo()) { Console.WriteLine("Catch"); } finally { Console.WriteLine("Outer Finally"); } } private static bool EvaluatesTo() { Console.WriteLine($"EvaluatesTo: {Flag}"); return true; } private static void SomeOperation() { try { Flag = true; throw new Exception("Boom"); } finally { Flag = false; Console.WriteLine("Inner Finally"); […]

getter-only自动属性和expression式主体属性有什么区别?

在C#6中,可以通过使用getter-only自动属性来简化实现属性。 例如,如果我正在实现抽象的Stream类: public override bool CanRead { get; } = true; 不过,我也可以用一个expression式体来编写它,在C#6中也是新的: public override bool CanRead => true; 两者有什么区别,我应该什么时候使用其中一种?

字典初始值设定项与集合初始值设定项相比有什么好处

最近有很多关于C#6.0中新增function的讨论 最受关注的function之一是在C#6.0中使用Dictionary初始值设定项 但是,等等,我们一直在使用集合初始化器来初始化集合,并且可以在.NET 4.0和.NET 4.5(不知道旧版本)中很好地初始化Dictionary Dictionary<int, string> myDict = new Dictionary<int, string>() { { 1,"Pankaj"}, { 2,"Pankaj"}, { 3,"Pankaj"} }; 那么在C#6.0中有什么新东西呢,他们在C#6.0中用什么字典初始化器来说话

null条件运算符不能使用可为空的types吗?

我在c#6中写了一段代码,出于一些奇怪的原因 var value = objectThatMayBeNull?.property; 但是这不是: int value = nullableInt?.Value; 通过不工作,我的意思是我得到一个编译错误,说Cannot resolve symbol 'Value' 。 任何想法为什么空条件运算符?. 不工作?

C#6.0string插值本地化

C#6.0有一个string插入 – 一个很好的function来格式化string,如: var name = "John"; WriteLine($"My name is {name}"); 该示例转换为 var name = "John"; WriteLine(String.Format("My name is {0}", name)); 从本地化的angular度来看,存储string要好得多: "My name is {name} {middlename} {surname}" 比在String.Format表示法: "My name is {0} {1} {2}" 如何使用.NET本地化的string插值? 是否会有一种方法把$“…”资源文件? 或者应该将string存储为“… {name}”并以某种方式进行插入?

自动属性只有吸气剂,可以设置,为什么?

我创build了一个自动化属性: public int Foo { get; } 这只是吸气剂。 但是当我构build一个构造函数时,我可以改变它的值: public MyClass(string name) { Foo = 5; } 为什么这是可能的,即使这是只能得到的?