If the input list is always sorted, you can take advantage of this and do a simple linear search:
List<int> numbers = new List<int>() { 11, 12, 13, 14 };
int result = numbers
.Zip(
numbers.Skip(1).Concat(new[] { int.MaxValue }),
(a, b) => (next: a+1, b))
.FirstOrDefault(x => x.next != x.b)
.next;
This is more ugly than @Enigmativity's solution, but it has the advantage of being linear rather than quadratic, which will have an impact if the list of numbers is large.
Personally, I'd just have written this as a cheap linear for loop:
for (int i = 0; i < numbers.Count - 1; i++)
{
int next = numbers[i] + 1;
if (next != numbers[i + 1])
{
return next;
}
}
return numbers[numbers.Count - 1] + 1;