Важное различие между ними заключается в том, что в вашей второй версии вы должны заранее знать, когда вы хотите остановиться, но в первой версии вы можете начать итерацию, а затем решить, когда остановиться. Вам не нужно знать заранее.
Вам также не нужно хранить весь список в памяти сразу с первой версией. Вы можете обрабатывать данные в потоковом режиме.
Преимущество второго заключается в том, что возвращение списка позволяет индексировать массив, а не обрабатывать элементы один за другим с самого начала. Вы можете использовать вторую версию, если знаете, сколько элементов вы хотите, и знаете, что список достаточно мал, чтобы поместиться в памяти.
Обратите внимание, что эти различия не имеют никакого отношения к тому, используете ли вы свойство или вызов функции. Первым можно переписать вызов функции, не имеющий параметров.
Если у вас есть только первая доступная версия, вы можете легко эмулировать вторую версию, используя Fibinocci().Take(20).ToList()
.