gpt4 book ai didi

c# - "Item"属性以及索引器

转载 作者:太空狗 更新时间:2023-10-29 21:45:12 24 4
gpt4 key购买 nike

我已阅读 Class with indexer and property named "Item" 的答案,但他们没有解释为什么我可以拥有一个具有多个索引器的类,所有索引器都创建 Item 属性和 get_Item/set_Item 方法(的当然工作得很好,因为它们是不同的重载),但我不能有一个显式的 Item 属性。

考虑代码:

namespace Test
{
class Program
{
static void Main(string[] args)
{
}

public int this[string val]
{
get
{
return 0;
}
set
{
}
}

public string this[int val] //this is valid
{
get
{
return string.Empty;
}
set
{
}
}

public int Item { get; set; } //this is not valid
}
}

对于两个索引器,创建了四种方法:

Int32 get_Item(String val)
Void set_Item(String val, Int32 value)
String get_Item(Int32 val)
Void set_Item(Int32 val, String value)

我希望我的属性(property)能够创造

Int32 get_Item()
Void set_Item(Int32 value)

这些重载通常是可以接受的,但不知何故编译器不允许我创建这样的属性。

请注意,我不需要重命名索引器等的方法,这是众所周知的 - 我需要一个解释。这个答案:https://stackoverflow.com/a/5110449/882200没有解释为什么我可以有多个索引器。

最佳答案

出于同样的原因,以下不会编译:

public class Test
{
public int Foo
{
get;
set;
}

public void Foo()
{
return;
}
}

上面的结果是“‘Test’类型已经包含了‘Foo’的定义”。虽然这些可以实现为 Foo() 方法和 get_Foo() 方法,但命名是一个实现细节——在语言级别,它是 .Foo() 和 .Foo,由于并非所有语言都支持,编译器认为这是一个错误。

类似地,其他语言可能不支持具有相同名称的索引器和属性。因此,尽管正如您所指出的那样可以 编译为 get_Item() 和 get_Item(Int32),但 CLR 设计者仍然选择不允许它。尽管 CLR 可以被设计成允许这样做,但它可能在语言级别不受支持,因此他们选择避免​​任何此类问题。

关于c# - "Item"属性以及索引器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17215782/

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