特定の一連の構文規則に準拠するために必要な文字列出力を生成することを意図しています。無効な出力が生成される可能性を防ぐ目的で、C# の厳密な型指定を使用してその構文を適用するために、オブジェクト モデルを作成しました。
肯定的なテスト、つまり有効な C# が有効な出力を生成するテストを作成できます。私ができないことは、否定的なテストを実行することです。つまり、無効な出力を生成しようとすると、コンパイル時にエラーがスローされることを確認します。
明示的な例:
namespace Abstract
{
public interface FooType { }
public interface FooString : FooType { }
}
public interface Integer : Abstract.FooType { }
public interface SingleLine : Abstract.FooString { }
public interface MultiLine : Abstract.FooString { }
public class Bar<T>
where T : Abstract.FooType
{
public Bar(string s) {
// do stuff with s and T, where T is SingleLine or MultiLine
}
public Bar(int i) {
// do stuff with i and T, where T is Integer
}
}
public static class Foo
{
public static Bar<T> Bar<T>(int i) where T : Integer {
return new Bar<T>(i);
}
public static Bar<SingleLine> Bar(string s) {
return new Bar<SingleLine>(s);
}
public static Bar<T> Bar<T>(string s) where T : Abstract.FooString {
return new Bar<T>(s);
}
}
それはすべて、私ができることです:
Foo.Bar<SingleLine>("some string"); // ok
Foo.Bar("another string"); // ok
Foo.Bar<MultiLine>("more\nstrings"); // still ok
Foo.Bar<Integer>(24) // also ok
// How to test these lines for compilation failure?
Foo.Bar<Integer>("no good");
Foo.Bar<MultiLine>(-1);
念のために言うと、私は VS2012 Express for Desktop を使用しています。