【问题标题】:Using "is" operator with a default(T) on the left side [duplicate]在左侧使用带有默认值(T)的“is”运算符[重复]
【发布时间】:2017-08-07 21:21:03
【问题描述】:

我有一个名为 AEntity 的抽象类,这是我游戏中实体的基类。

我还有几个接口来“标记”实体,例如:

interface EffectEntity<T> where T : AEntity
{
    void UpdateEffect();
}

在我的程序的一部分中,我有一个 List&lt;AEntity&gt; 和一个名为 add 的方法。

此列表不能包含EffectEntity。这是我添加方法的代码:

if (Item is EffectEntity<T>)
{
    throw new Exception("Cannot add an effectEntity to the still entities");
}
else allStillEntities.Add(Item);

这不会引发任何错误,但是当我将行 if(Item is EffectEntiy&lt;T&gt;) 更改为 if(default(T) is EffectEntity&lt;T&gt;) 时,它会发出警告 CS0148:“给定的表达式永远不是提供的类型 ('EffectEntity&lt;T&gt;') 类型”

这是为什么?他们不应该产生相同的结果吗?
是的,当然,左侧使用Item 的版本可能效率更高,但我仍然很好奇。

【问题讨论】:

    标签: c# .net operators compiler-warnings


    【解决方案1】:

    default(T) 将是null,编译器知道这一点。 null isn't an instance of EffectEntity&lt;T&gt;,所以它知道会是false

    Item 可能是也可能不是 nullEffectEntity&lt;T&gt; 实例或其他类型的对象。

    【讨论】:

    • 好吧,但是为什么会为空呢?
    • 因为它是一个引用类型,并且这是所有引用类型的默认值。
    • 哦,好的!谢谢!因此,如果我要执行`int i = default(int)`,它会给出一个非空值吗?这是否意味着任何引用类型都可以为空(如没有 T?)?
    • @OptimisticPeach 您可以运行该代码并亲自查看i 在这种情况下会是什么。是的,所有引用类型都可以为空。
    猜你喜欢
    • 2010-11-08
    • 1970-01-01
    • 2015-06-12
    • 1970-01-01
    • 2016-06-23
    相关资源
    最近更新 更多