Enum.IsDefined为字符串返回false

时间:2017-12-31 09:03:00

标签: c# enums

我使用let location = locations.last let destination = CLLocation(latitude: order!.user_coord![0], longitude: order!.user_coord![1]) let origin = CLLocation(latitude: (location?.coordinate.latitude)!, longitude: (location?.coordinate.longitude)!) self.drawPath(startLocation: origin, endLocation: destination) self.createMarker(titleMarker: order!.store_name!, iconMarker: UIImage(named: "icons8-user_filled")!, latitude: order!.user_coord![0], longitude: order!.user_coord![1]) self.createMarker(titleMarker: "User", iconMarker: UIImage(named: "icons8-mountain_biking")!, latitude: (location?.coordinate.latitude)!, longitude: (location?.coordinate.longitude)!) let camera = GMSCameraPosition.camera(withLatitude: (location?.coordinate.latitude)!, longitude: (location?.coordinate.longitude)!, zoom: 17.0) self.map.animate(to: camera) locationManager.stopUpdatingLocation() 方法作为字符串,但在我认为应该得到Enum.IsDefined()的情况下,我得到False。请检查以下代码:

True

C# Fiddle Demo
结果:

public enum YourEnum : int
{
    Zero = 0,
    One = 1
}

public class Program
{

    public static void Main(string[] args)
    {
        Console.WriteLine(Enum.IsDefined(typeof(YourEnum), 1));
        Console.WriteLine(Enum.IsDefined(typeof(YourEnum), 1.ToString()));
    }
} 

我不知道为什么在第二种情况下我应该True False 。任何帮助表示赞赏。

2 个答案:

答案 0 :(得分:20)

当您将字符串传递给IsDefined()方法时,您会询问枚举中是否有值具有该名称The documentation读到:

  

值参数可以是以下任何一项:
  •任何类型为enumType的成员   •一个变量,其值为enumType类型的枚举成员   •枚举成员名称的字符串表示形式。字符串中的字符必须与枚举成员名称具有相同的大小写。
  •enumType的基础类型的值。

(强调我的)

读起来有点令人困惑,因为第一,第二和第四个选项首先导致相同的事情:传递的枚举类型的值(当然是盒装的)。

但第三个选项是你的场景发生了什么,字符串需要与枚举成员的名称匹配。您正在传递字符串"1",枚举中唯一有效的名称是"Zero""One"。字符串"1"与其中任何一个都不匹配,因此IsDefined()会返回false

答案 1 :(得分:5)

如果传递一个字符串作为参数,它将查看其中一个枚举的名称是否等于指定的字符串。以下将返回true:

Console.WriteLine(Enum.IsDefined(typeof(YourEnum), 1));
Console.WriteLine(Enum.IsDefined(typeof(YourEnum), "Zero"));

有关详情,请参阅source code (line 1503)。话虽如此,最好从文档中推断出这些信息,因为@Peter Duniho的回答已经显示,因为实现可以改变:但是,如果你好奇,源代码就在那里。