C#中返回IList<T>的方法为何可返回null及如何判断返回默认值
问题解答
1. 为什么返回IList接口的方法可以返回null
你对「IList
但你需要明确一个核心规则:所有接口类型本身都属于引用类型,和它的具体实现类型是值类型还是引用类型无关。当你把实现了接口的struct赋值给接口类型的变量/返回值时,会发生装箱操作,装箱后的结果是堆上的引用对象,因此接口类型的变量天然支持赋值为null,和实现类型没有关联。
你提供的示例代码中,SomeMethod的返回值明确声明为IList<int>,本身就是引用类型,因此不管是否存在MyStructList这样的struct实现,返回null都是完全合法的语法。
2. 如何检查返回IList的方法是否返回了默认值
分两种场景处理即可:
- 如果方法的返回值是显式的IList
接口类型 (和你的示例场景一致):这种场景下接口类型的默认值就是null,直接判空即可:
var result = SomeMethod(); // 写法1:普通判空 if (result == null) { // 命中默认值逻辑 } // 写法2:C# 模式匹配写法(推荐) if (result is null) { // 命中默认值逻辑 }
- 如果是泛型方法,返回值为泛型参数
T且T被约束为实现了IList<T>:这种场景下T可能是值类型(比如你的MyStructList),值类型的默认值不是null,需要用默认值比较器判断:
// 泛型方法示例 public T SomeGenericMethod<T>() where T : IList<int> { return default; } // 检查逻辑 var genericResult = SomeGenericMethod<MyStructList>(); if (EqualityComparer<MyStructList>.Default.Equals(genericResult, default)) { // 命中默认值逻辑 }
如果除了默认值之外,你还需要额外判断返回的集合是否为空,可在判空之后补充判断result.Count == 0即可。
内容的提问来源于stack exchange,提问作者mfroeh
相关产品推荐
相关产品推荐

