2017-07-25 70 views
2

由於某種原因,我有一種感覺,只有Jon Skeet會知道這個答案,但它值得一試。爲什麼不能用泛代碼編寫的代碼操作需要明確的參數聲明

我有這個方法存根,用作代理來生成命令。

public static void SetCommand<T>(string commandName, Action<T> execution) 
    where T : new() 
{ 
    //Omitted unimportant 
} 

我有一個調用此代碼的函數,但行爲因調用方式而異。

如果我通過顯式聲明的行動調用的代碼,如果我聲明瞭一個函數來表示我的行動

public static void GenerateClass(ClassDeclarationOptions classOptions) 
{ 

} 

然後,我需要顯式地所有的參數都可以解決細

Action<ClassDeclarationOptions> test = (t) => { }; 
SetCommand(GENERATE_CLASS_COMMAND, test); 

然而聲明參數時將它傳遞給函數如下:

SetCommand<ClassDeclarationOptions>(GENERATE_CLASS_COMMAND, Commands.GenerateClass); 

一個人能解釋爲什麼編譯器不能從方法定義解決我的泛型參數

+1

想象一下,'Commands.GenerateClass'中有一個重載過程,它採用了不同的參數類型,編譯器無法找出使用哪一個參數類型。 – DavidG

+0

@DavidG好點我沒有想到這一點。如果您將該帖子發佈爲答案,我會將其標記爲正確 –

+0

當然可能還有其他原因,但這是首先想到的。 – DavidG

回答

3

比方說,有上Commands.GenerateClass,需要一個不同的參數類型,例如過載:

public static void GenerateClass(SomeOtherClass stuff) 
{ 
} 

現在有沒有辦法讓編譯器找出哪個GenerateClass方法使用。但是,只要指定了類型參數,模糊度就會消失。

所以,即使你有一個方法,並且編譯器推斷出類型參數,你也可以稍後添加第二個方法,甚至在沒有意識到的情況下破壞現有的代碼。僅僅爲了強制代碼是明確的更安全。

+0

完美,我會在時間限制消失後接受! –