我错了还是Roslyn REPL过度保护?

时间:2014-01-23 18:51:52

标签: c# roslyn static-constructor

我正在尝试像LinqPad一样使用Roslyn,但我正在使用完全有效的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声称我为ToUnderlying调用out参数无效。

在你问我为什么不使用静态构造函数之前,我想确保在我的类中保留beforefieldinit class属性。否则,每次访问该方法时,我都会支付初始化费用。在C#中,这被认为是有效的,但Roslyn告诉我(6,76): error CS0199: A static readonly field cannot be passed ref or out (except in a static constructor)

1 个答案:

答案 0 :(得分:2)

看起来你只是在你正在使用的CTP版本中遇到Roslyn编译器中的错误。 Roslyn的当前(内部到Microsoft)构建没有问题。