2012-01-06 49 views
1

我不認爲它與犀牛模擬相關。VS2010編譯器錯誤「不能分配給參數類型T」不是一個約束問題我相信

它是一個編譯器錯誤?

ERROR:comment下面第二段代碼中的行給出編譯器警告,我不明白爲什麼。更讓我驚訝的是,第3區的作品。

這一個工作得很好,所以我把它轉換成通用ActivatePresenterAction2

private void ActivatePresenterAction1(IListViewHelper<PairDirEntry> lvh) 
{ 
    var args = lvh.GetArgumentsForCallsMadeOn(
      x => x.ActionOnActivateItem(Arg<Action<PairDirEntry>>.Is.Anything)); 
    Assert.That(args.Count, Is.EqualTo(1)); 
    Assert.That(args[0].Length, Is.EqualTo(1)); 
    var action = (Action<PairDirEntry>)(args[0][0]); // extract the ActivateOnItem action 
    action(_pairDirEntry); // as if ActionOnActivateItem() 
} 

這一個工程編譯失敗的註釋行

private void ActivatePresenterAction2<T>(IListViewHelper<T> lvh) where T : class 
{ 
    var args = lvh.GetArgumentsForCallsMadeOn(
      x => x.ActionOnActivateItem(Arg<Action<T>>.Is.Anything)); 
    Assert.That(args.Count, Is.EqualTo(1)); 
    Assert.That(args[0].Length, Is.EqualTo(1)); 
    var action = (Action<T>)(args[0][0]); // extract the ActivateOnItem action 
    // 
    // ERROR: is not assignable to parameter type T on hliighted line 
    // marking the parameter _pairDirEntry 
    // 
    action(_pairDirEntry); // as if ActionOnActivateItem() 
} 

這種變化以優良的一般作品。

ActivatePresenterAction3(_stubSearchResultListViewHelper)(_pairDirEntry); 

private Action<T> ActivatePresenterAction3<T>(IListViewHelper<T> lvh) where T : class 
{ 
    var args = lvh.GetArgumentsForCallsMadeOn(
      x => x.ActionOnActivateItem(Arg<Action<T>>.Is.Anything)); 
    Assert.That(args.Count, Is.EqualTo(1)); 
    Assert.That(args[0].Length, Is.EqualTo(1)); 
    return (Action<T>)(args[0][0]); 
} 
+0

你爲什麼使用泛型? – SLaks 2012-01-06 02:15:34

+0

因爲我有3個不同的版本,如果IListViewHelper 與不同類型的T. – 2012-01-06 08:19:44

回答

2

由於編譯器錯誤中明確規定,_pairDirEntry不是T,所以你不能把它傳遞給一個委託,需要一個T

+0

從我可以看到_pairDirEntry肯定是一個T - 這是一個PairDirEntry在這種情況下或Action1和Action3將無法正常工作。 – 2012-01-06 02:09:58

+2

@RobinLuiten:'_pairDirEntry'不能是'T',因爲'T'是方法的通用參數,'_pairDirEntry'是類中的一個字段。 – SLaks 2012-01-06 02:15:24

+0

謝謝你,我一天中的大部分時間都在外面,所以只是回到這裏,我不知道我現在失去了什麼。如果我添加了T parm的參數並通過了它,那就沒事了。我不太清楚爲什麼在寫一篇文章到這裏之前,這已經被困了2-3個小時。 – 2012-01-06 08:24:02

2

提供一些更詳細的SLaks的回答,考慮這個類:

class C<T> 
{ 
    private T t; //assume that this gets assigned somehow 
    private void M<T>(Action<T> action) 
    { 
     action(this.t); 
    } 
} 

這不會編譯,因爲該方法的T參數隱藏類的T參數。即使它們具有相同的名稱,它們也不會引用相同的類型。動作參數的類型與字段t不同。

這可以通過從該方法中除去的類型的參數來校正:

class C<T> 
{ 
    private T t; //assume that this gets assigned somehow 
    private void M(Action<T> action) 
    { 
     action(this.t); 
    } 
} 

現在,行動的說法是類型相同的字段t

+0

該類沒有任何其他泛型,類中只有一個泛型類型,並且該類型爲該方法的類型T. – 2012-01-06 08:20:57

相關問題