using System.Collections.Generic;
public static void Main()
string[] s = new string[] { "one", "two", "three", "four", "five", "six" };
IReadOnlyList<Reference<string>> sr = new List<Reference<string>>
Console.WriteLine(sr[1]);
Console.WriteLine(sr[1]);
public class Reference<T>
private readonly Func<T> referenceFunc;
public Reference(Func<T> referenceFunc)
this.referenceFunc = referenceFunc;
public T Value => this.referenceFunc();
public static implicit operator T(Reference<T> reference)
public static implicit operator Reference<T>(Func<T> referenceFunc)
return new Reference<T>(referenceFunc);
public override string ToString()
return this.Value?.ToString();
public static class ReferenceExtensions
public static void Add<T>(
this ICollection<Reference<T>> collection,
collection.Add(referenceFunc);