(work in progress)
There are differences between C# and Java at the language level and there are differences at the framework level.
Java allows classes in interfaces and methods inside of enums. In C#, both these cases are illegal and will lead to compile errors.
/** * interface with nested class */ public interface Bits { public boolean get(int index); public int length(); public class MatchAllBits: Bits { final int len; public MatchAllBits(int len) { this.len = len; } @Override public boolean get(int index) { return true; } @Override public int length() { return len; } } } /** * */ public enum Version { @Deprecated LUCENE_4_10, LUCENE_5_0, @Deprecated LUCENE_CURRENT public boolean onOrAfter(Version other) { return compareTo(other) >= 0; } public static Version parseLeniently(String version) { final String parsedMatchVersion = version .toUpperCase(Locale.ROOT) .replaceFirst("^(\\d+)\\.(\\d+)$", "LUCENE_$1_$2") .replaceFirst("^LUCENE_(\\d)(\\d)$", "LUCENE_$1_$2"); return Version.valueOf(parsedMatchVersion); } }
When porting the above code in C#, the methods and classes need to extracted. For example, extract the interface into IBits. Extract the methods from the enum into its own static Util class.
public interface IBits { bool this[int index]; int Length { get; set; } } public class Bits { public class MatchAllBits: Bits { final int len; public MatchAllBits(int len) { this.len = len; } @Override public boolean get(int index) { return true; } @Override public int length() { return len; } } } public enum Version { @Deprecated LUCENE_4_10, LUCENE_5_0, @Deprecated LUCENE_CURRENT; } public static class VersionUtil { public static boolean OnOrAfter(Version current, Version other) { return current.CompareTo(other) >= 0; } public static Version ParseLeniently(String version) { throw new NotImplementedException(); } }