2016-01-24 3 views
4

Я использовал short.Parse(somestring) в прошлом. Но в последнее время я видел запутанное использование short.Parse(), как показано ниже:Is short.Parse свойство или метод?

var shortArray = Array.ConvertAll(stringArr, short.Parse); 

Так, Array.ConvertAll ожидает массив и преобразователь. Вот и славно! Но как мы передаемshort.Parseкак (или как) недвижимость? Я не нашел такого имущества в: Int16 struct. Итак, что здесь происходит на самом деле?

+0

«short.Parse» - это ссылка на группу методов 'Parse()' –

+0

. Ответ на этот вопрос может помочь: Каков тип параметра второго параметра? – Mixxiphoid

+0

"и преобразователь". И «конвертер» есть? –

ответ

5

Array.ConvertAll принимает в качестве второго параметра экземпляр делегата Converter<TIn, TOut>. Подпись этого делегата по существу совпадает с short.Parse - оба возвращают значение для одного аргумента.

Компилятор преобразует «группу методов» в совместимый делегат. Это известно как неявное преобразование группы методов.

Для сравнения, явного создания делегата будет выглядеть следующим образом:

Array.ConvertAll(stringArr, new Converter<string, short>(short.Parse)); 

Таким образом, чтобы ответить вам вопрос: это все-таки способ, а не собственность. Что вы здесь делаете, передаете этот метод как делегат . Вы предоставляете ConvertAll с функцией вызова: когда она преобразует элемент в исходный массив, он выполнит short.Parse(element) и использует значение, возвращаемое в новом массиве.

+0

Спасибо, что сообщили мне о _implicit group group conversion_.У меня будет чтение. – snippetkid

5

short.Parse - это способ. Но в качестве аргумента можно передать метод.

Обратите внимание на разницу между вызовом метода и передачей значения, возвращаемого этим методом (short.Parse()), и передачи самого метода (short.Parse).

Внутренне это будет передавать адрес метода, чтобы получатель этого аргумента мог его вызвать.

+0

Это немного nitpicking, но 'short.Parse' не передается как адрес - он используется для создания делегата соответствующего типа (можно увидеть в полученном в результате IL' newobj экземпляре void class [mscorlib ] System.Converter2 [string, int16]; ::. Ctor (object, native int) '). Никто, очевидно, не будет сомневаться в том, что делегаты - это не что иное, как адреса методов с необязательной ссылкой на экземпляр ('this') внутри, но группа методов - делегировать автоматическое« преобразование »выполняется компилятором - вы не можете передавать группу методов в любом месте. –

+0

@EugenePodskal: Итак, вы признаете, что внутренне передается адрес метода? Разве это не то, что я сказал? –

+0

Я абсолютно признаю это, но упоминание группы методов - делегировать преобразование и что вы не можете передать группу методов в любом месте, сделает этот ответ более технически правильным. И это предотвратит любые заблуждения относительно групп методов в тех, кто его прочитает. Если вы сейчас прочтете этот ответ, он может подумать, что группа методов передана, когда это не так. –

Смежные вопросы