【发布时间】:2019-04-11 13:03:57
【问题描述】:
我可以重构这段代码(流行的as/null check 模式)
var a = b as MyType;
if(a != null) { ... }
..变成一个不错的"is" type pattern expression:
if(b is MyType a) { ... }
..这很酷...我想...是吗?
但现在我也在考虑重构
var a = SomeMethod();
if(a != null) { ... }
..进入:
if(SomMethod() is MyType a) { ... }
注意:没有 as 并且 SomeMethod() 已经返回 MyType。它看起来像(伪代码)if(A is A),很容易混淆,不是吗?
第一个重构是合法的,但是后一个呢?我不是检查自己的 IL 专家,C# 7.0 功能对我来说仍然是新的。或许还有一些我还没发现的问题?
【问题讨论】:
-
第二个是合法的,我看过别人推荐的,但我不确定我是它的忠实粉丝......
-
@JeroenMostert:我刚刚尝试了您的
if (SomeMethod() is var o变体,但是当返回值为null 时,它实际上返回true?你确定,它在语义上是一样的吗?这实际上使我想到了一个后续问题:为什么结果不同?if (SomeMethod() is var o)总是返回 true,而if (SomeMethod() is object o)在返回值为 null 时返回 false。 -
@ChristophHerold 这就是
SomeMethod() is var o和SomeMethod() is MyType a之间的区别 --var匹配 null,但MyType不匹配。 -
@Christophe
var匹配从SomeMethod()的返回值推断的类型。 docs.microsoft.com/en-us/dotnet/csharp/… 是我能找到的最好的文档,尽管那是关于 switch 语句的。 -
IMO 这个问题相当具体:“这合法吗,有什么问题吗?”。虽然 cmets 对这是否是一个好主意有一些意见,但这不是问题的意图。