IsDefined<TEnum>(TEnum value)的意义何在?

  • 本文关键字:TEnum value IsDefined c# enums
  • 更新时间 :
  • 英文 :


在enum.cs中有两种实现。IsDefined,我总是使用的第一个是IsDefined(Type enumType, object value)效果很好

但是还有一个IsDefined,这个:


public static bool IsDefined<TEnum>(TEnum value) where TEnum : struct, Enum
{
RuntimeType enumType = (RuntimeType)typeof(TEnum);
ulong[] ulValues = Enum.InternalGetValues(enumType);
ulong ulValue = Enum.ToUInt64(value);
return Array.BinarySearch(ulValues, ulValue) >= 0;
}

来源:Enum.cs

这个方法有可能返回false吗?

这看起来像一个bug,这个函数应该接受一个Enum作为参数,而不是一个TEnum。还是我完全没有抓住重点?

我希望这个函数像重载一样工作,只是一个合成糖

Thanks to Etienne de Martel

是的,它可以返回false,这个想法是在检查值是否定义之前进行强制转换:

using System;
public enum E
{
V = 0
}
public class Program
{
public static void Main()
{
E e = (E)1;
Console.WriteLine(Enum.IsDefined(e));
}
}

接受object的版本是可以的,但是它强制使用"装箱";操作,即强制分配堆。孤立来看,负担得起,但是:分配加起来。当时,. net还没有泛型,所以:这是能做到的最好的了。

泛型可以缓解装箱问题(对于值类型),因此这里使用它来避免这种开销。它还使调用变得更容易,因为在大多数情况下根本不需要指定类型(除了传递文字0时)。编译器可以从实参的类型推断出泛型。

最新更新