gpt4 book ai didi

c# - 具有默认 0(零)值的属性索引器

转载 作者:太空狗 更新时间:2023-10-29 22:32:55 24 4
gpt4 key购买 nike

我在使用属性索引器 (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
}

为什么在使用默认索引器(x2 变量)时我会返回所有结果?

似乎int参数(0)自动转换为枚举类型(Type1)。这不是我所期待的....

提前感谢您的解释!

最佳答案

C# 规范声明 0(并且零)隐式可转换为任何枚举类型:

6.1.3 An implicit enumeration conversion permits the decimal-integer-literal 0 to be converted to any enum-type and to any nullable-type whose underlying type is an enum-type.

如果您没有明确地为您的枚举分配值,它们是 0..n,所以在您的情况下 Type1 是 0。此行为与属性索引器无关。

因为零是唯一存在的隐式转换,所以这会很好地编译:

IEnumerable<CustomMessage> x2 = cml[0];

但这不会编译,因为 1 没有隐式转换:

IEnumerable<CustomMessage> x2 = cml[1];

在这种情况下,您需要显式转换值:

IEnumerable<CustomMessage> x2 = cml[(MessageType)1]; //Compiles fine

关于c# - 具有默认 0(零)值的属性索引器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16589327/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com