2014-08-27 134 views
1

我定義兩個接口如下:訪問成員

public interface IData 
{   
    double value { set; get; } 
} 

public interface IInterval<C, M> 
{ 
    C left { set; get; } 
    M data { set; get; } 
} 

然後,我使用這兩個接口,用於以下類聲明。

public class TESTClass<I, M> 
     where I : IInterval<int, M>, new() 
     where M : IData 
{ 
    public I interval{ set; get; } 

    public TESTClass() 
    { 
     // This is invalid, cos property value is not visible at initialization ... 
     interval = new I() { left = 0, data.value = 0 }; 

     // instead I have to do as: 
     interval = new I() { left = 0 }; 
     interval.data.value = 0; 
    } 
} 

我在這裏錯過了什麼? 如果你能幫我弄清楚這一點,我將不勝感激。

+0

你爲什麼不在'IInterval '處添加'where M:IData'? – ja72 2014-08-27 16:28:48

回答

2

那麼,你當然可以這樣做。語法有點不同。

public TESTClass() 
{ 
    interval = new I() 
    { 
     left = 0, 
     data = //Reads data property, 
     { 
      value = 0 //set data.value to 0 
     } 
    } 
} 
0

您不能使用成員訪問操作符(.)訪問對象初始值設定項中的子屬性。

這工作:

public class TESTClass<I, M> 
     where I : IInterval<int, M>, new() 
     where M : IData, new() 
{ 
    public I interval{ set; get; } 

    public TESTClass() 
    { 
     interval = new I() { left = 0, data = new M {value = 0} }; 
    } 
} 
+0

但它做了一些明顯不同的事情;它不是功能相同的代碼。 – Servy 2014-08-27 15:48:44

+0

我假設這是OP的意圖。即使'data.value = 0'被允許,從它們的代碼中它仍然會引發'NullReferenceException'。 – 2014-08-27 15:51:37

+0

如果'I'初始化它,那麼不應該這樣做,如果在初始化時需要完成更多工作,那麼對於'I'來說很重要,畢竟不是所有類型都可以有一個明智的無參數構造函數。 – Servy 2014-08-27 15:56:50