此索引器访问定义是什么意思?

时间:2019-01-28 14:37:18

标签: c# .net

有人可以将docs中的这句话翻译成人类语言:

  

索引器的类型及其参数的类型必须至少与索引器本身具有相同的可访问性

  • 例如,如果“索引器的类型” int float ,那么 int float 是否可访问? “索引器的类型” “索引器本身”
  • 有什么区别
  • 那么“参数” 是方括号内的那些值吗?那么什么是正式参数
  • 又如何不能访问“其参数类型”
  • 然后是整句话的意思。

3 个答案:

答案 0 :(得分:1)

索引器包含两种不同的类型:方括号中传递的索引类型和与该索引相关的元素的类型。您似乎假设索引始终是if。绝没有限制,它可以是任意类型:

int

这假设public class MyClass { public ThirdClass this[IndexClass i] { get { ... }; set { ... } } } ThirdClass都可以访问。例如,如果IndexClassIndexClass类,则abobe代码肯定不会编译,因为该属性(在本例中为索引器)是internal

这根本不是索引器的特殊功能。想象一下任何常用方法:

public

在此应用相同的访问规则:public ThirdClass(IndexClass i) { ... } ThirdClass必须具有与公开这些类型的成员相同的至少可访问性(或更高的可访问性)。

答案 1 :(得分:0)

文档所指的是Access Modifiers

这告诉您的是,您使用的两种类型,即索引器返回的一种和用作索引参数的一种,需要具有与索引器本身相同的可访问性级别。

考虑一下:

public class SomeClass
{
    public IndexerResult this[int index]    // Indexer declaration  
    {  
        // get and set accessors  
    }  
}

internal class IndexerResult
{
   //Some code
}

然后您尝试以下操作:

SomeClass obj = new SomeClass();
var value = obj[0];

如果尝试编译,则会收到错误消息:

  

可访问性不一致:索引器返回类型'IndexerResult'的访问性比索引器'SomeClass.this [int]'

原因很明显,并在消息中进行了解释。您不能有public索引器公开internal类(IndexerResult)。

参数index也是如此。考虑一下如果我们翻转类型会发生什么:

public int this[IndexerResult index]    // Indexer declaration  
{ 
    // get and set accessors  
} 

这一次,您正在尝试使用一种比该方法更不可访问的类型。如果类型是内部类型,如何创建IndexerResult的实例以传递给索引器?

现在是踢球者。考虑使用接口代替时会发生什么:

public class SomeClass
{
    public IIndexerResult this[int index]    
    {
        get { return new IndexerResult(); } //This is perfectly fine!
    }
}

internal class IndexerResult : IIndexerResult
{
    //Some code
}

public interface IIndexerResult
{

}

这将编译没有问题,您将可以在外部使用internalIndexerResult。这是因为实现的详细信息现在隐藏在界面的后面,因此您不了解实际的对象。除了您选择要公开的内容(由界面表示)之外,没有“公开”的内容。

答案 2 :(得分:0)

简单地说,您不能使索引器,属性或方法包含使用某些访问修饰符时将无法访问的类型。

Public使这些东西在其他库中可见,并且公开返回或采用internal类型的Indexer是没有意义的,因为它在其他库中不可用(因为您不能使用这些类型)。 如果使索引器internal相同,则不能使其返回或采用private类型,因为它再次在库中的其他类中不可用。

但是您应该知道索引器的可访问性取决于封装类型。

考虑以下示例:

public class Bar { }
public class Foo { }
public class IndexerClass
{
    public Bar this[Foo param]
    {
        get { return null; }
    }
}

所有内容均为public,并且应该在其他库中可见,因此您不能设置BarFoo internal,因为其他库看不到它们。编译器不允许您进行编译。 如果您想使BarFoo internal,则必须使索引器的访问性降低,因此可以使索引器本身internal或使类{{ 1}} IndexerClass

internal