[英]C# type inference (“var”) assignment from '??' null-coalescing operator
我已经阅读了关于空合并的许多SO问题??
运算符但它们似乎都没有解决以下特定问题,它既不涉及可空性 ( 此处 ), 运算符优先级 ( 此处和此处 ),也不涉及隐式转换 ( 此处 , 此处 , 此处和此处 )。 我也阅读了.NET文档 (更多这里 )并尝试阅读官方规范 ,但遗憾的是都无济于事。
所以这里。 以下两行之间的唯一区别是在第二行中使用var
作为类型推断,而在第一行中使用显式类型Random
,而第二行则给出如图所示的错误,而第一行则很好。
Random x = new Random() ?? (x = new Random()); // ok
var y = new Random() ?? (y = new Random()); // CS0841
// ^-------- error here
CS0841:在声明之前不能使用局部变量'y'
第二条线是什么让结果不确定?
从我上面提到的hubub,我了解到左侧的可能性??
operator为null
引入了对其右侧的实际实例化类型的运行时确定的依赖性。 嗯,好吧,我想,......这意味着什么? 也许警报的数量一般都在飘荡??
这个网站上的运营商应该是某种可怕的警告......
现在归零,我认为var
关键字的整个要点(与dynamic
非常特别相反)是, 根据定义 ,它不像运行时那样容易受到影响 。
换句话说,即使我们采取“永不窥视超越任何分配保守的,但完全站得住脚规则=
运算符”,这样,我们因此与的右侧任何没有得到有用的信息??
,然后单独基于左侧,整体结果必须 “兼容” Random
。 也就是说,结果必须是Random
或更具体的(派生的)类型; 它不能更一般。 因此,根据定义,不应该将Random
作为推断类型,因为这个编译时使用var
?
据我所知,用运行时考虑因素破坏var
使其失败。 这不正是dynamic
的意义吗? 所以我猜问题是:
dynamic
是否已经实现? var
不能保持严格保守主义的策略 - 总是推断出可以静态推断的最具体的类型 - 同时空归合运算符根据来自的信息做任何想做的事情。未来? 这不是运行时考虑因素。
使用var
声明的变量的编译时类型是其初始化程序的静态类型。 静态类型??
expression是两个操作数的静态类型的常见类型。 但是第二个操作数的静态类型是y
的静态类型,这是未知的。 因此,整个初始化程序的静态类型是未知的,并且扣除失败。
确实存在初始化一致的类型,但是使用C#推理规则无法找到它们。
使用var
,类型在编译时计算出来。 因此,当你写这个:
var y = new Random() ?? (y = new Random());
编译器无法确定编译时y
的类型是什么,因此开始大喊大叫 - 决定是否左侧??
是否为null,将在运行时确定。
一个更好的例子是:
public interface IA { void Do(); }
public class A : IA { ... }
public class B : IA { ... }
A a = null;
var something = a ?? new B();
应该是什么类型的something
: IA
, A
还是B
?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.