Вопрос инициализации C # - PullRequest
6 голосов
/ 07 декабря 2010

Это может быть хромой, но здесь:

public interface Interface<T>
{
    T Value { get; }
}

public class InterfaceProxy<T> : Interface<T>
{
    public T Value { get; set; }
}

public class ImplementedInterface: InterfaceProxy<Double> {}

Теперь я хочу создать экземпляр ImplementedInterface и инициализировать его члены.

Можно ли это сделать как-то так (используя списки инициализации) или такое же поведение можно достичь только с помощью конструктора с аргументом Double?

var x = new ImplementedInteface { 30.0 };

Ответы [ 8 ]

7 голосов
/ 07 декабря 2010

Может быть сделано:

var x = new ImplementedInteface { Value = 30.0 };
2 голосов
/ 07 декабря 2010

Единственный способ добиться того, чего вы хотите - это если ваш класс реализует IEnumerable<T> и имеет метод Add:

public class MyClass : IEnumerable<double>
{
   public void Add(double x){}
}

Тогда вы можете сделать:

MyClass mc = new MyClass { 20.0 };

Очевидно, что это не то, что вы хотите, потому что это не устанавливает Value и позволяет добавлять несколько значений:

MyClass mc = new MyClass { 20.0, 30.0 , 40.0 };

Просто перейдите к инициализации стандартного объекта, как указали другие:

var x = new ImplementedInterface() { Value = 30.0 };
2 голосов
/ 07 декабря 2010
var x = new ImplementedInterface() { Value = 30.0 };
2 голосов
/ 07 декабря 2010

Вы должны быть в состоянии сделать:

var x = new ImplementedInterface {Value = 30.0};
1 голос
/ 07 декабря 2010

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

1 голос
/ 07 декабря 2010

var instance = new ImplementedInterface { Value = 30.0 }; будет работать. Однако на самом деле это не тот же набор операций, что и в списках инициализаторов C ++ - это инициализатор объектов. Он инициализирует новый экземпляр с помощью конструктора по умолчанию, а затем вызывает установщики свойств для каждого свойства.

Другими словами, объект создается перед запуском установщиков свойств. Если вы хотите, чтобы значения свойств были установлены до завершения конструирования ImplementedInterface, вам, как вы заметили, нужно написать конструктор. Это различие в поведении обычно не имеет значения, но хорошо осознавать.

0 голосов
/ 07 декабря 2010

Вы определенно можете использовать список инициализации, но вы должны указать, что такое 30.0 (это верно для любого списка инициализации, а не только для вашего кода):

var x = new ImplementedInteface { Value=30.0 };
0 голосов
/ 07 декабря 2010
var x = new ImplementedInterface { Value = 30.0 };
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...