想象一下我这样做:
var player = players.FirstOrDefault();
或者确实运行最后一个函数的任何复杂的LINQ表达式都是FirstOrDefault
。
执行后,player
可以default()
。如何在保持var
样式类型声明的同时检查?甚至可以用c#?
1
if (player == default(Player))
明确的Player
会使var player
感到无用。我不妨使用Player player = ...
代替var player ...
,这里的整个问题是如何保持var
。
2
if (player == default(typeof(player)))
不可编辑。我可以做typeof(Player)
但是看到上面的感觉毫无意义。
3
if (player == null)
default(any reference type)
为null
。但是,如果Player类是struct
类型,那么显然这是不正确的。
我知道我可以检查数组的大小,然后执行.First()
甚至是.DefaultIfEmpty(something)
,但这会使.FirstOrDefault()
毫无意义并且在.DefaultIfEmpty
的情况下要求您知道类类型,它不遵守该问题的var
限制。
我有什么方法可以使用var
来编写这段代码,这种代码适用于var可以代表的所有类型吗?
答案 0 :(得分:2)
null
或0
或default(TheTypeGoesHere)
。
var
允许您执行某项操作的唯一时间是不能使用匿名类型,并且由于它们始终是引用类型,因此在这种情况下您可以使用null
。< / p>
答案 1 :(得分:2)
您可以编写扩展方法:
public static class Extensions
{
public static bool IsDefault<T>(this T source)
{
return EqualityComparer<T>.Default.Equals(source, default(T));
}
}
然后使用:
var player = players.FirstOrDefault();
if (player.IsDefault())
{
//
}
答案 2 :(得分:1)
如果你有一个集合想要获得默认值而不必指定类型,你可以做类似的事情:
if(player == players.Take(0).SingleOrDefault())
或
if(player == players.SingleOrDefault(o => false))