Когда я работаю с явными реализациями интерфейса в C #, часто возникает необходимость привести объект к одному из его интерфейсов, чтобы получить доступ к члену этого интерфейса.Из-за повышенной надежности и удобства обслуживания, обеспечиваемой проверкой типов во время компиляции, я всегда предпочитал использовать неявные преобразования для выполнения этого.Единственный известный мне способ сделать это - задействовать две строки кода и ввести еще одну переменную в область видимости.Ниже приведен пример:
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
во время выполнения.Однако я несколько предпочитаю простоту явного синтаксиса приведения и часто вижу, что он используется в коде других людей.
Мой вопрос состоит из трех частей:
- Какой из перечисленных выше вариантов вы используетепредпочитаете (и почему)?
- Есть ли лучший способ сделать это?
- Каковы некоторые рекомендации относительно выполнения явных приведений, когда возможны неявные приведения?