Синтаксис Чистого Литого


Есть ли другой способ сделать это без всех лишних за скобки здесь?

((ScheduledTask)(scheduledTasks[intCount])).TaskIntervalType


177
1
c#
задан 25 июня 2011 в 03:06 Источник Поделиться
Комментарии
3 ответа

Несколько лучше:

(scheduledTasks[intCount] as ScheduledTask).TaskIntervalType

Обратите внимание, что поведение будет несколько иным: как бросить не бросить исключение, когда не удалась, но возвращать нуль - так что вы получите исключение NullReferenceException (при попытке доступа к свойству на нуль отсчета) вместо бросания исключения.

5
ответ дан 25 июня 2011 в 03:06 Источник Поделиться

var task = (ScheduledTask)scheduledTasks[intCount];
var interval = task.TaskIntervalType;

Можно использовать как вместо сайта:

var task = scheduledTasks[intCount] as ScheduledTask;
var interval = task.TaskIntervalType;

но это изменит поведение актеров. Например, как отмечается, он будет возвращать значение null вместо того, чтобы бросать исключение при неудачной конвертации. Для другого, он не будет выполнять любые пользовательские преобразования между типами, которые вы могли бы иметь.

Хотя с учетом сказанного, используя , как это, вероятно, лучше, чем литье, потому что он ведет себя более последовательно и надежно, чем литой.

И со всем , что сказал, пожалуй, правильный подход заключается в том, чтобы изменить свой массив строго типизированных или разоблачить TaskIntervalType как собственность на интерфейс или базовый класс? Это способ литья не будет нужен вообще.

Например,

public interface ITask
{
IntervalType TaskIntervalType { get; }
}

public ScheduledTask : ITask
{}

public MyStuff()
{
List<ITask> scheduledTasks = new List<ITask>();
// populate the list, etc...

/// ... and back to your example:
var type = scheduledTasks[intCount].TaskIntervalType;
}

4
ответ дан 25 июня 2011 в 03:06 Источник Поделиться

Это может быть безопаснее (не уверен, что имена переменных и их типы):

    ScheduledTask Task =  scheduledTasks[intCount] as ScheduledTask;

IntervalType TaskType;

if (Task != null)
{
TaskType = Task.TaskIntervalType;
}

0
ответ дан 25 июня 2011 в 04:06 Источник Поделиться