ネタ元
自称勝ち組の R.田中一郎さんのエントリ。
私も、out, ref はあまり使いたくないので、お気持ちは良くわかります。
ですが、コメントの「is の結果と Parse の結果をひとまとめにする方が違和感があります」というのも、なるほどなぁと思います。
じゃあ、こういうのはどうでしょう?
public class ParseResult {
protected ParseResult() { }
public ParseResult(object resultValue) {
_resultValue = resultValue;
}
private object _resultValue;
public static readonly ParseResult FailedResult = ParseFailedResult.Singleton;
public virtual object GetResultValue() {
return _resultValue;
}
}
internal class ParseFailedResult : ParseResult {
private ParseFailedResult() : base() { }
internal static readonly ParseFailedResult Singleton = new ParseFailedResult();
public override object GetResultValue() {
throw new InvalidOperationException("Parse 失敗だってばよ");
}
}
いわゆる null オブジェクトと同じですね。
成功時は値を持った ParseResult を返し、失敗したときはシングルトンである ParseResult.FailedResult を返してやる。
使用側は下記の様に判別すればよいと。
ParseResult result = OriginalParse(numberText);
if (result != ParseResult.FailedResult) {
int resultValue = (int) result.GetResultValue();
// some process...
}