C#初始化问题

时间:2010-12-07 16:21:26

标签: c# initialization

这可能很蹩脚,但在这里:

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 个答案:

答案 0 :(得分:7)

可以通过以下方式完成:

var x = new ImplementedInteface { Value = 30.0 };

答案 1 :(得分:2)

你应该可以这样做:

var x = new ImplementedInterface {Value = 30.0};

答案 2 :(得分:2)

var x = new ImplementedInterface() { Value = 30.0 };

答案 3 :(得分:2)

实现你所追求的目标的唯一方法是你的类实现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 };

答案 4 :(得分:1)

var instance = new ImplementedInterface { Value = 30.0 };会奏效。但是,这与C ++初始化程序列表实际上并不是一组操作 - 这是一个对象初始化程序。它通过默认构造函数初始化新实例,然后为每个属性调用属性setter。

换句话说,该对象是在属性设置器运行之前构造的。如果您希望在ImplementedInterface构造之前设置属性的值完成,则必须编写构造函数,如您所述。这种行为上的区别通常无关紧要,但要注意这一点很好。

答案 5 :(得分:1)

我不确定您是否有特殊原因以这种方式使用接口,但以下代码可能适合您。

public class ImplementedInterface2 : List<double> { }

 public class test
    {
        public void x()
        {
            var x = new ImplementedInterface2() { 30.0 };
        }
    }

答案 6 :(得分:0)

var x = new ImplementedInterface { Value = 30.0 };

答案 7 :(得分:0)

你绝对可以使用初始化列表,但你必须指定30.0是什么(对于任何初始化列表都是如此,而不仅仅是你拥有的代码):

var x = new ImplementedInteface { Value=30.0 };