Best C# implementation of IndexOfAny(string, params string[])
Review


Don't use abbreviated variable names s, curAns and posAns; use self describing names: value, index and targetIndex instead. 
The nullable int could be replaced with -1. This reads cleaner and allows you to bypass the final ?? operator in curAns ?? -1.
You can optimize the count curAns.Value + target.Length with adding -1 because we don't care about finding another match on the currently best found index.
You should exit early if no targets are specified


Refactored

public static int IndexOfAny2(this string value, params string[] targets)
{
    var index = -1;
    if (targets == null || targets.Length == 0) return index;

    foreach (var target in targets)
    {
        var targetIndex = value.IndexOf(target, 0, 
            index &gt; -1 ? index + target.Length - 1 : value.Length);

        if (targetIndex &gt;= 0 &amp;&amp; (index == -1 || targetIndex &lt; index))
        {
            index = targetIndex;
            if (index == 0)
            {
                break;
            }
        }
    }

    return index;
}