virtual
「GetBaseAddresses()」というメソッドを持つ基本クラスを作成しています。リターンタイプとしてありIEnumerable<Uri>
ます。基本クラスをyield
列挙しても結果は得られませんが、派生クラスには、メソッドをオーバーライドして、必要な数のアイテムを返すオプションがあります。
基本的な方法は次のとおりです。
public virtual IEnumerable<Uri> GetBaseAddresses() { }
問題は、それがコンパイルされないことです。コンパイラが満足するためには、値を返す必要があります。だから、私は空の結果を出したいので、私はただ戻るでしょうnull
?
public virtual IEnumerable<Uri> GetBaseAddresses() { return null; }
問題は、誰かがforeach
基本クラスのインスタンスでを実行すると、「オブジェクト参照が設定されていません...」という実行時エラーでクラッシュすることです。
それで、yield return
キーワードがC#コンパイラで魔法をかけることを思い出してください...私はこのコンパイラハックを思いつきました(ちなみにそれは機能します)。
public virtual IEnumerable<Uri> GetBaseAddresses()
{
if (false) { yield return new Uri(""); }
}
不思議なことに、「if(false){...}」コードが完全にコンパイルされても、コンパイラは「値を返さなければならない」要件を満たしていることに満足しており、私が望むことを正確に実行します。つまり、列挙しても安全な空の結果セット。
私の質問は-コンパイラのトリックなしでこれを行う方法はありますか?