我已经从另一个开发人员那里继承了一些MVC代码。 有一个称为DataCache的静态类,其中包含许多类似以下的方法:
public static IEnumerable<EntityFieldsList> UserGroupsFields()
{
if (Cache["userGroupFields"] is List<EntityFieldsList> userGroupFields) return userGroupFields;
...some code...
Cache.Set("userGroupFields", userGroupFields, policy);
return userGroupFields;
}
我不知道第一行的工作方式。
如何将变量userGroupFields
声明为IS
比较的一部分?
然后它具有如何在同一行上立即返回的值?肯定会一直是null
吗?
答案 0 :(得分:0)
if (Cache["userGroupFields"] is List<EntityFieldsList> userGroupFields)
用英语,如果Cache["userGroupFields"]
的返回值为List<EntityFieldsList>
,则定义List<EntityFieldsList> userGroupFields
它使用is
类型模式来提供类型的IComparable.CompareTo(Object)
方法的实现。
如果没有名为userGroupFields
的全局静态变量,则代码的最后一部分肯定无法正常工作。 Check This
答案 1 :(得分:0)
上一个答案在某种程度上是正确的,但实际上IS
运算符确实声明了变量,无论条件是否为真。
请参见此处的示例,尝试交换前两行 https://dotnetfiddle.net/biC0ks
答案 2 :(得分:0)
这是is
关键字的所谓type pattern,其格式为:
expr is type varname
其中 expr 是一个表达式,其计算结果为某种类型的实例, type 是要将expr的结果转换为该类型的名称,并且如果
is
测试为true,则 varname 是_expr的结果转换为的对象。
如果 expr 不为null,并且以下任一条件为true,则is表达式为true:
- expr 是与 type 相同类型的实例。
- expr是从 type 派生的类型的实例。换句话说,可以将 expr 的结果转换为 type 的实例。
- expr 的编译时类型为 type 的基类,而 expr 的运行时类型为 type 或从 type 派生。变量的编译时类型是其声明中定义的变量类型。变量的运行时类型是分配给该变量的实例的类型。
- expr 是实现 type 接口的类型的实例。
如果 expr 为true且
is
与if语句一起使用,则会分配 varname 且仅在if语句内具有局部范围。
(重点是我的)