【问题标题】:Am I wrong or is Roslyn REPL being overprotective?我错了还是 Roslyn REPL 保护过度了?
【发布时间】:2014-01-23 18:51:51
【问题描述】:

我正在尝试像 LinqPad 一样使用 Roslyn,但我正在使用完全有效的 C# 代码 sn-ps,并且被告知它们是无效的。 考虑这种沼泽标准实用方法。

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 类属性。否则,我将支付每次访问该方法时初始化它的费用。在 C# 中,这被认为是有效的,但 Roslyn 告诉我 (6,76): error CS0199: A static readonly field cannot be passed ref or out (except in a static constructor)

【问题讨论】:

    标签: c# roslyn static-constructor


    【解决方案1】:

    看起来您只是在您使用的 CTP 版本中遇到了 Roslyn 编译器中的错误。 Roslyn 的当前(Microsoft 内部)版本与该代码没有问题。

    【讨论】:

    • 谢谢,关于下一个 CTP 版本什么时候发布?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-01-18
    • 2010-12-31
    • 2011-07-20
    • 1970-01-01
    • 2018-12-22
    • 1970-01-01
    • 2014-03-14
    相关资源
    最近更新 更多