有没有办法在C#中编写二进制文字,比如用0x前缀十六进制?0b不起作用.
如果没有,有什么简单的方法可以做到这一点?某种字符串转换?
我今天意外地定义了一个没有值的枚举.像这样的例如:
public enum MyConfusingEnum{}
Run Code Online (Sandbox Code Playgroud)
编译器很高兴让我定义它并成功构建代码.
现在我显然不能使用传统意义上的代码,因为代码,...
var mySadCompiler = MyConfusingEnum;
Run Code Online (Sandbox Code Playgroud)
没有指定值,但有趣的是我很能说,..
var myRoundTheHousesZeroState = Activator.CreateInstance<MyConfusingEnum>();
Run Code Online (Sandbox Code Playgroud)
正如我所提到的,它是一个MyConfusingEnum值为0 的值类型;
我的问题是为什么编译器允许一个空的定义,是否有任何可能有用的场景?
我正在研究一个Web服务方法,它将接收一个int数组作为参数,然后,在方法内部,我将数组中的值转换为枚举值,并将它们存储在枚举列表中.但是,当传递不在枚举中的值时,它将被添加到枚举列表中而没有任何问题.不InvalidCastException,没什么.我做了一个看起来像这样的测试项目:
static class Program
{
static void Main(string[] args)
{
List<TestValues> values = new List<TestValues>() {
TestValues.Value1,
TestValues.Value2,
(TestValues)15
};
foreach (var val in values)
Console.WriteLine(val);
Console.Read();
}
enum TestValues
{
Value1 = 2,
Value2 = 4,
Value3 = 8
}
}
Run Code Online (Sandbox Code Playgroud)
当我运行它时,输出是:
Value1
Value2
15
Run Code Online (Sandbox Code Playgroud)
对于我的Web服务,我将实现验证,因此根本不会有任何问题.但是......这很奇怪!运行时不应该抛出一个InvalidCastException 或ArgumentOutOfRangeException类似的东西吗?由于我得到了一个枚举列表(而不是int值),我希望将值限制为枚举值(这就是枚举的用途).
我错过了什么吗?这是一个.NET错误,一个C#错误还是有一些我不知道的枚举?
我以不同的方式找到了一个关于实现枚举的好例子.我认为这就是所谓的类型安全枚举模式.我开始使用它,但我意识到我不能在switch语句中使用它.
我的实现如下所示:
public sealed class MyState
{
private readonly string m_Name;
private readonly int m_Value;
public static readonly MyState PASSED= new MyState(1, "OK");
public static readonly MyState FAILED= new MyState(2, "ERROR");
private MyState(int value, string name)
{
m_Name = name;
m_Value = value;
}
public override string ToString()
{
return m_Name;
}
public int GetIntValue()
{
return m_Value;
}
}
Run Code Online (Sandbox Code Playgroud)
为了能够在C#的switch语句中使用这种模式,我可以添加到我的类中?
谢谢.
我正在将字符串类型的数值转换为相应的枚举.当我测试我的代码时,我发现有趣的行为令我感到困惑.
使用下面的代码示例,如果/当"s"变量的值与Enum值之一不匹配时,有人可以阐明为什么不抛出异常?另外,如何将sEnum var设置为Stooge枚举定义中不存在的值?
class Program
{
enum Stooge
{
Unspecified,
Moe,
Larry,
Curly,
Shemp
}
static void Main(string[] args)
{
while (true)
{
Console.WriteLine("Enter a number...");
string s = Console.ReadLine();
Stooge sEnum = (Stooge)(int.Parse(s)); //Why doesn't this line throw if s != 0, 1, 2, 3, or 4?
Console.WriteLine("\r\nYou entered: {0}\r\nEnum String Value: {1}\r\nEnum Int Value: {2}\r\n", s, sEnum.ToString(), (int)sEnum);
}
}
}
Run Code Online (Sandbox Code Playgroud) 在阅读Jon Skeet对这个特定问题的回答时如何才能使我的类变量只能设置为三个选择中的一个?我在C#中学到了一些我不知道的新东西,我想是CLR类型系统.
这是合法的背后的原因是什么:
public enum Tests
{
Zero = 0,
One,
Two
}
var nonExistantTestsValue = (Tests)1000;
Run Code Online (Sandbox Code Playgroud)
这将完全编译,但我没有看到为什么它应该是这样的原因.就我所见,整个枚举点是将指定类型的给定变量的值限制为一定数量的选项.
如果enum定义所施加的限制很容易被打破,那么重点是什么(除了可读性问题)?您可以使用反射显然确保它是一个有效的值,但为什么不在编译时完成?
可能有一个很好的理由让它以它的方式工作,但我没有看到它.
我有一个带有POST方法的简单Controller。
我的模型具有枚举类型的属性。
当我发送有效值时,一切正常
{ "MyProperty": "Option2"}
Run Code Online (Sandbox Code Playgroud)
要么
{ "MyProperty": 2}
Run Code Online (Sandbox Code Playgroud)
如果我发送无效的字符串
{ "MyProperty": "Option15"}
Run Code Online (Sandbox Code Playgroud)
它正确获取默认值(Option1),但是如果我发送无效的int,它将保留无效值
{ "MyProperty": 15}
Run Code Online (Sandbox Code Playgroud)
我可以避免这种情况并获得默认值还是抛出错误?
谢谢
public class ValuesController : ApiController
{
[HttpPost]
public void Post(MyModel value) {}
}
public class MyModel
{
[JsonConverter(typeof(Newtonsoft.Json.Converters.StringEnumConverter))]
public MyEnum MyProperty { get; set; }
}
public enum MyEnum
{
Option1 = 0,
Option2,
Option3
}
Run Code Online (Sandbox Code Playgroud)
更新
我知道我可以将任何int强制转换为枚举,这不是问题。
@AakashM的建议解决了我一半的问题,我不知道AllowIntegerValues
现在我在发布无效的int时正确地收到错误
{ "MyProperty": 15}
Run Code Online (Sandbox Code Playgroud)
现在唯一有问题的情况是当我发布一个数字字符串时(这很奇怪,因为当我发送无效的非数字字符串时,它正确地失败了)
{ "MyProperty": "15"}
Run Code Online (Sandbox Code Playgroud)