Bid*_*dou 5 .net c# enums indexer properties
我在使用属性索引器(C#)时发现了一种奇怪的行为.
考虑以下程序:
public class Program
{
public static void Main(string[] args)
{
CustomMessageList cml = new CustomMessageList
{
new CustomMessage(), // Type1
new CustomMessage(), // Type1
new CustomMessage(), // Type1
new CustomMessage(), // Type1
new CustomMessage(), // Type1
new CustomMessage() // Type1
};
// Empty
IEnumerable<CustomMessage> x1 = cml[MessageType.Type2];
// Contains all elements (6)
IEnumerable<CustomMessage> x2 = cml[0]; // MessageType.Type1 ????
// Does not compile!
IEnumerable<CustomMessage> x3 = cml[1]; // NOT MessageType.Type2 ????
}
}
public class CustomMessageList : List<CustomMessage>
{
public IEnumerable<CustomMessage> this[MessageType type]
{
get { return this.Where(msg => msg.MessageType == type); }
}
}
public class CustomMessage
{
public MessageType MessageType { get; set; }
}
public enum MessageType
{
Type1,
Type2,
Type3
}
Run Code Online (Sandbox Code Playgroud)
为什么在使用默认索引器(x2变量)时会得到所有结果?
似乎int
参数(0)自动转换为枚举类型(Type1).这不是我所期待的......
在此先感谢您的解释!
vcs*_*nes 10
C#规范声明0(并且只有零)可以隐式转换为任何枚举类型:
6.1.3隐式枚举转换允许将decimal-integer-literal 0转换为任何枚举类型和任何可以为其类型为枚举类型的可空类型.
如果没有使用值明确指定枚举,则它们为0..n,因此Type1
在您的情况下为0.此行为与属性索引器无关.
由于零是唯一存在的隐式转换,因此编译正常:
IEnumerable<CustomMessage> x2 = cml[0];
Run Code Online (Sandbox Code Playgroud)
但这不会编译,因为1没有隐式转换:
IEnumerable<CustomMessage> x2 = cml[1];
Run Code Online (Sandbox Code Playgroud)
在这种情况下,您需要显式转换值:
IEnumerable<CustomMessage> x2 = cml[(MessageType)1]; //Compiles fine
Run Code Online (Sandbox Code Playgroud)