Атрибут IndexerName у индексаторов
От: sumkincpp
Дата: 14.01.11 13:09
Оценка:
Всем привет!

У индексаторов можно указать атрибут System.Runtime.CompilerServices.IndexerName (msdn), например :
    [System.Runtime.CompilerServices.IndexerName("Int")]
    public int this[int index]
    {
        get { return 1; }
    }

MSDN пишет, что таким образом можно задать имя для индексатора, которое можно использовать в других языках.
И в C# при попытке вызвать obj.get_Int(7) выпадет ошибка
2011-01-13-Indexer.cs(37,37): Error CS0571: 'TempRecord.this[int].get': cannot explicitly call operator or accessor (CS0571) (2011-01-13-Indexer)


1) Правильно ли то, что на код C# отсутствие/наличие этого атрибута в большинстве случаев не влияет на остальной код — если учесть, что функций вида get_{имя атрибута} не объявлено?

2) В каких языках и где можно использовать индексатор по имени get_Int? Есть предположение, что если компилировать в сборку, то атрибут будет доступен как фнукция. Но где про это можно прочитать?

3) Почему для двух индексаторов необходимо указывать атрибуты с одинаковыми именами, пример :
class TempRecord
{
    [System.Runtime.CompilerServices.IndexerName("Int")]
    public int this[int index]
    {
        get { return 1; }
    }

//    [System.Runtime.CompilerServices.IndexerName("Int")]
    public double this[double index]
    {
        get { return 2.0; }
    }
}

class MainClass
{
    static void Main()
    {
        TempRecord t = new TempRecord();

        System.Console.WriteLine("{0}", t[1]);
        System.Console.WriteLine("{0}", t[2.4]);

        System.Console.ReadKey();
    }
}

2011-01-13-Indexer.cs(19,19): Error CS0668: Two indexers have different names; the IndexerName attribute must be used with the same name on every indexer within a type (CS0668) (2011-01-13-Indexer)


Еще здесь нашел интересный этюд c IndexerName
Автор: nikov
Дата: 29.08.08
.
indexername system.runtime.compilerservices.indexername
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.