2014-01-23 5 views
2

나는 Roslyn을 LinqPad처럼 사용하려고하는데, C#을 완벽하게 사용하는 코드 스 니펫을 사용하고 있으며 유효하지 않다고 들었습니다. 이 늪지 표준 유틸리티 방법을 고려하십시오. 나를 ToUnderlying에 대한 out 매개 변수를 호출하는내가 잘못했거나 Roslyn REPL이 과보호되고 있습니까?

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>; 
    } 
} 

로슬린은 무효라고 주장하고있다.

왜 정적 생성자를 사용하지 않는지 묻기 전에, 내 클래스에 beforefieldinit 클래스 특성을 유지해야합니다. 그렇지 않으면 메서드에 액세스 할 때마다 초기화 할 때 비용을 지불하게됩니다. C#에서는 유효한 것으로 간주되지만 Roslyn이 말하고 있습니다. (6,76): error CS0199: A static readonly field cannot be passed ref or out (except in a static constructor)

답변

2

사용중인 CTP 버전의 Roslyn 컴파일러에서 버그를 치는 것 같습니다. Roslyn의 현재 (내부에서 Microsoft로) 빌드는 해당 코드에 아무런 문제가 없습니다.

+1

감사합니다. CTP의 다음 버전이 출시 될 때 어떤 단어가 나옵니까? –