2

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# ではこれは有効と見なされますが、Roslyn はそう言っています(6,76): error CS0199: A static readonly field cannot be passed ref or out (except in a static constructor)

4

1 に答える 1