C#で明示的なインターフェイスの実装を使用している場合、そのインターフェイスのメンバーにアクセスするために、そのインターフェイスの1つにオブジェクトをキャストする必要が生じることがよくあります。コンパイル時の型チェックによって信頼性と保守性が向上したため、これを実行するために暗黙の変換を使用することを常に好みました。これを行うために私が知っている唯一の方法は、2行のコードを含み、スコープに別の変数を導入します。以下に例を示します。
public interface IMyType
{
string SayHello();
}
public class MyType : IMyType
{
string IMyType.SayHello() { return "Hello!"; }
}
class Program
{
static void Main(string[] args)
{
var item = new MyType();
// Option 1 - Implicit cast. Compile time checked but takes two lines.
IMyType item2 = item;
System.Console.WriteLine(item2.SayHello());
// Option 2 - One line but risks an InvalidCastException at runtime if MyType changes.
System.Console.WriteLine(((IMyType)item).SayHello());
// Option 3 - One line but risks a NullReferenceException at runtime if MyType changes.
System.Console.WriteLine((item as IMyType).SayHello());
}
}
コンパイラはその実装を知っているので、後で宣言を変更すると実行時ではなくコンパイルエラーが発生するため、暗黙的なキャストの方が明示的なキャストよりも優れていると思います。ただし、明示的なキャスト構文の単純さをいくらか好み、他の人のコードで使用されるのをよく見ました。MyType
IMyType
MyType
InvalidCastException
私の質問は3つあります:
- 上記のオプションのどれが好きですか(そしてその理由)?
- これを行うためのより良い方法はありますか?
- 暗黙的なキャストが可能な場合に明示的なキャストを実行することに関するいくつかのベストプラクティスは何ですか?