シグネチャと意味
Scalaにあるような、string Name{ get; }をもつクラスorインターフェースがなんでも入れられる型は、コンパイルが通れば型のエラーは起こらないという意味で静的型としての安全性は保たれている。
void SetName({ string Name{ get; } } item) { this.Name = item.Name; }
でもこれって意味あるのかなあと思う。同じシグネチャを持つが、継承関係にないクラスを入れるのには役に立つが、同じシグネチャを持つが意味的に異なるName{ get; }を持つものも入れられてしまう。また、意味的には同じだがシグネチャが異なるものを入れられない。
void SetName(Func<string> getName) { this.Name = getName(); }
こうすれば、
SetName(item => item.FullName);
シグネチャが異なっても入れられる。意味的に異なるかどうかは自分で考えろというわけで、どっちにしろScalaのやつでも意味的に異なるかどうか考えなきゃいけないのでこれで十分じゃないかと思う。実行も速いし。