Tag: null propagation operator

空传播运算符,输出参数和错误的编译器错误?

假设我有一个具有Dictionary类型属性的类,它可以为null。 这会编译但是对TryGetValue()的调用可能会在运行时抛出NullRefexception: MyClass c = …; string val; if(c.PossiblyNullDictionary.TryGetValue(“someKey”, out val)) { Console.WriteLine(val); } 所以我添加了一个空传播运算符来防范空值,但这不会编译: MyClass c = …; string val; if( c.PossiblyNullDictionary ?. TryGetValue(“someKey”, out val) ?? false ) { Console.WriteLine(val); // use of unassigned local variable } 是否有一个实际的用例,其中val将在if块中未初始化,或者编译器是否根本不能推断出这个(以及为什么)? 更新:最干净的(?)解决方法^ H ^ H ^ H ^ H ^ H修复此问题: MyClass c = …; string […]

接线员’?’ 不能应用于’T’类型的操作数

试图使Feature通用,然后突然编译说 接线员’?’ 不能应用于’T’类型的操作数 这是代码 public abstract class Feature { public T Value { get { return GetValue?.Invoke(); } // here is error set { SetValue?.Invoke(value); } } public Func GetValue { get; set; } public Action SetValue { get; set; } } 可以使用此代码 get { if (GetValue != null) return GetValue(); return default(T); } 但我想知道如何修复那个漂亮的C#6.0单线程。

C#6.0空传播运算符和属性赋值

为了彻底解释,这个问题已经彻底改革。 我注意到C#6.0中空传播运算符的限制似乎很差,因为你不能针对已经传播的对象调用属性设置器 (尽管你可以针对已经传播的对象调用属性getter ) 。 正如您将从生成的IL (我已经反映到C#中)看到的那样,没有任何东西可以限制使用空传播调用属性设置器的能力。 首先,我创建了一个简单的类,包括Java样式的Get / Set方法和具有公共getter / setter访问权限的属性。 public class Person { public Person(string name, DateTime birthday) { Name = name; } public string Name { get; set; } public void SetName(string name) { Name = name; } public string GetName() { return Name; } } 我在下面的测试类中测试了空传播的能力。 public class Program { […]