2010-12-07 116 views
6

這可能是瘸腿的,但在這裏:C#初始化問題

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 }; 
+0

絕對不是跛腳,很好的問題。 +1 – Gabe 2010-12-07 16:27:26

回答

8

可以這樣做:

var x = new ImplementedInteface { Value = 30.0 }; 
+0

您錯過了課後名稱的圓括號。 – 2010-12-07 16:26:46

2

你應該能夠做到:

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

你絕對可以使用初始化列表,但是你有指定什麼是30.0(這對任何初始化列表都是如此,而不僅僅是你的代碼有):

var x = new ImplementedInteface { Value=30.0 }; 
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 }; 
1

var instance = new ImplementedInterface { Value = 30.0 };會工作。但是,這與C++初始化程序列表不同,它是一個對象初始化程序。它通過默認構造函數初始化新實例,然後調用每個屬性的屬性設置器。

換句話說,該對象是在屬性設置器運行之前構造的。如果您希望在構造ImplementedInterface之前設置的屬性的值完成,那麼您必須編寫一個構造函數,如您所述。這種行爲上的差異通常並不重要,但應該意識到這一點很重要。

1

我不確定您是否有特殊的理由使用接口,但以下代碼可能適用於您。

public class ImplementedInterface2 : List<double> { } 

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