在一个相关的问题中,我的团队即将(希望)开始使用LINQ,我想利用匿名类型.混合VB.NET的Option Strict(我们在整个项目的生命周期中使用过)和新的Option Infer指令的最佳方法是什么?
可能重复:
最佳实践:选项推断
混合VB.NET的Option Strict和新的Option Infer指令的最佳方法是什么?
我正在开发一个旧的解决方案,从VB6转换为VB.NET.
实际上,文件中的默认选项是
Option Strict On
Option Explicit On
Run Code Online (Sandbox Code Playgroud)
我想使用LINQ,并发现它也更容易使用Option Infer On.
写得少,阅读少(更容易).
然而,(保守的,从我的观点来看)团队的一部分保持Option Infer Off并且坚持不使用它,而没有明确解释原因.
在您看来,使用Option Infer On的"危险"是什么,以及其他两个选项(Strict和Explicit,都是On)?
给出以下C#代码:
var a = new[] {"123", "321", 1}; //no best type found for implicitly typed array
Run Code Online (Sandbox Code Playgroud)
与VB.NET中的对应物:
Dim a = {"123", "321", 1} 'no errors
Run Code Online (Sandbox Code Playgroud)
似乎VB.NET能够正确地推断出a=的类型Object(),而C#会抱怨,直到上面的内容被修复为:
var a = new object[] {"123", "321", 1};
Run Code Online (Sandbox Code Playgroud)
有没有办法在上述场景中自动推断C#中的类型?
编辑:在C#沙箱中使用不同类型后的有趣观察 - 如果所有元素在继承树中具有共同父项,并且该父项不是 a Object,或者如果元素可以转换为更宽泛的类型,则可以正确推断类型(不丢失精度,例如Integer -> Double).所以这两个都可行:
var a = new[] {1, 1.0}; //will infer double[]
var a = new[] {new A(), new B()}; //will infer A[], if B inherits from A
Run Code Online (Sandbox Code Playgroud)
我认为这种行为在C#中是不一致的,因为所有类型都继承自Object,所以它与其他任何类型的祖先都没有太大不同.这可能是一个设计,所以没有必要争论,但如果你知道原因,知道原因会很有趣.