I представляется ошибкой компилятора (или ограничением, если вы предпочитаете).
Я уменьшил минимальный сбойный случай до:
static private IThing FindThings(dynamic spec)
{
IThing resultingThing;
if ((null!=spec) && dictionary.TryGetValue(spec, out resultingThing))
return resultingThing;
return null;
}
, что дает такую же диагностику компилятора, безс использованием поиска членов по динамике, а также блоков итераторов.
Для справки, моно-компилятор не отключается по этому поводу:
using System;
using System.Collections.Generic;
public static class X
{
public interface IThing { }
private static readonly IDictionary<string, IThing> dictionary = new Dictionary<string, IThing>();
static private IThing FindThings(dynamic spec)
{
IThing resultingThing;
if ((null!=spec) && dictionary.TryGetValue(spec, out resultingThing))
return resultingThing;
return null;
}
public static void Main(string[] s)
{
}
}
Компилируя это:
dmcs -v -warnaserror -warn:4 t.cs
Нет предупреждений