列出 RemoveLast 元素并返回它,其中 T 可为空
List RemoveLast Element and returning it with T being nullable
虽然我不太明白为什么 C# 不提供在一个命令中删除 AND return 元素的集合方法,但我尝试编写自己的自定义扩展...
public static T RemoveLast<T>(this List<T> list)
{
if (list.Count > 0)
{
var item = list[list.Count - 1];
list.RemoveAt(list.Count - 1);
return item;
}
return null;
}
但是,这会导致 return 行出现错误:无法将表达式类型 'null' 转换为 return 类型 'T'。
但是尝试将 T
设置为可为空 (T?
) 也是不可能的。我如何更改它以使 T 可以为空?
NVM,知道了:
return default(T);
您的问题可能有不同的解决方案。一个单一的解决方案无法解决您的问题
让我们讨论适合您需求的解决方案方案
场景 1: 如果您想要 return 最后一个元素并且如果最后一个元素不存在那么您想要 return 该数据类型的默认值,那么你可以使用 return default(T);
public static T RemoveLast<T>(this List<T> list)
{
if (list.Count > 0)
{
var item = list[list.Count - 1];
list.RemoveAt(list.Count - 1);
return item;
}
return default(T);
}
场景 2: 如果你只想为值类型创建这个函数,那么你可以像下面那样使 return value 为 Nullable
public static Nullable<T> RemoveLast<T>(this List<T> list) where T:struct
{
if (list.Count > 0)
{
var item = list[list.Count - 1];
list.RemoveAt(list.Count - 1);
return (T)item;
}
return null;
}
此处需要指定 T 类型为结构,因为引用类型默认可为空,并且使它们可为空对编译器没有任何意义,因此编译器不会允许它
虽然我不太明白为什么 C# 不提供在一个命令中删除 AND return 元素的集合方法,但我尝试编写自己的自定义扩展...
public static T RemoveLast<T>(this List<T> list)
{
if (list.Count > 0)
{
var item = list[list.Count - 1];
list.RemoveAt(list.Count - 1);
return item;
}
return null;
}
但是,这会导致 return 行出现错误:无法将表达式类型 'null' 转换为 return 类型 'T'。
但是尝试将 T
设置为可为空 (T?
) 也是不可能的。我如何更改它以使 T 可以为空?
NVM,知道了:
return default(T);
您的问题可能有不同的解决方案。一个单一的解决方案无法解决您的问题
让我们讨论适合您需求的解决方案方案
场景 1: 如果您想要 return 最后一个元素并且如果最后一个元素不存在那么您想要 return 该数据类型的默认值,那么你可以使用 return default(T);
public static T RemoveLast<T>(this List<T> list)
{
if (list.Count > 0)
{
var item = list[list.Count - 1];
list.RemoveAt(list.Count - 1);
return item;
}
return default(T);
}
场景 2: 如果你只想为值类型创建这个函数,那么你可以像下面那样使 return value 为 Nullable
public static Nullable<T> RemoveLast<T>(this List<T> list) where T:struct
{
if (list.Count > 0)
{
var item = list[list.Count - 1];
list.RemoveAt(list.Count - 1);
return (T)item;
}
return null;
}
此处需要指定 T 类型为结构,因为引用类型默认可为空,并且使它们可为空对编译器没有任何意义,因此编译器不会允许它