Опитвам се да използвам Roslyn като LinqPad, но вземам кодови фрагменти, които са напълно валидни C# и ми се казва, че са невалидни. Помислете за този блатен стандартен полезен метод.
public static class EnumConvert<TEnum, TUnderlying>
where TEnum : struct,IFormattable, IConvertible, IComparable
where TUnderlying : struct,IFormattable, IConvertible, IComparable, IComparable<TUnderlying>, IEquatable<TUnderlying>
{
public static readonly Converter<TEnum, TUnderlying> ToUnderlying;
public static readonly Converter<TUnderlying, TEnum> ToEnum =
Init(out ToUnderlying);
private static Converter<TUnderlying, TEnum> Init(out Converter<TEnum, TUnderlying> underlier)
{
if (Type.GetTypeCode(typeof(TEnum)) != Type.GetTypeCode(typeof(TUnderlying)) ||
typeof(TEnum) == typeof(TUnderlying))
{
throw new ArgumentException("TEnum does not derive from TUnderlying");
}
Func<TUnderlying, TUnderlying> Identity = x => x;
underlier = Delegate.CreateDelegate(typeof(Converter<TEnum, TUnderlying>), Identity.Method) as Converter<TEnum, TUnderlying>;
return Delegate.CreateDelegate(typeof(Converter<TUnderlying, TEnum>), Identity.Method) as Converter<TUnderlying, TEnum>;
}
}
Roslyn твърди, че е невалидно да извиквам параметъра out за ToUnderlying
.
Преди да ме попитате защо не използвам статичен конструктор, бих искал да се уверя, че запазвам атрибута beforefieldinit
клас в моя клас. В противен случай ще плащам разходите за инициализиране всеки път, когато методът е достъпен. В C# това се счита за валидно, но Рослин ми казва, че (6,76): error CS0199: A static readonly field cannot be passed ref or out (except in a static constructor)