我似乎無法找到任何參考,指出在.NET 2.0項目中是否仍然需要使用C#4.0。
是的。編譯器需要該屬性。無論你自己定義它還是使用System.Core
中的那個都取決於你。雖然在你的特定情況下,System.Core
不是一個選項,因爲這只是.NET 3.5的一部分。
一旦您升級到更高版本,3.5或更高版本,您可以安全地從您的項目中一併刪除此屬性,只需使用System.Core
中的那個。
如果您已升級到Visual Studio 2010;那麼您正在使用C#4.0編譯器。這意味着,所有你需要的是一個ExtensionAttribute
:
namespace System.Runtime.CompilerServices
{
[AttributeUsage(AttributeTargets.Method, AllowMultiple = false, Inherited = false)]
public class ExtensionAttribute : Attribute
{
}
}
它必須以正確的命名空間。
一旦你得到了什麼地方,你可以聲明的擴展方法以正常的方式(因爲你使用的是C#4.0編譯器):
public static class Extensions
{
public static string ToTitleCase(this string str)
{
//omitted
}
}
,然後使用它像一個擴展方法:
var str = "hello world";
str.ToTitleCase();
你自己實際上並不需要把ExtensionAttribute
放在任何東西上; C#4.0編譯器會爲你做。實質上,所有編譯器的需求是能夠找到一個名爲ExtensionAttribute
的屬性。
Brr,討厭的黑客。雖然工作。如果忘記刪除我想象的屬性,稍後升級會有點痛苦。 –
@HansPassant我不認爲這會是災難性的。編譯器只會選擇哪個屬性是「最接近」的。如果當前裝配中有一個,它將使用該裝配。我不認爲編譯器在意*哪個*屬性被使用;只要它有正確的(全名)名稱即可。雖然同意,但它有點難看。 – vcsjones
是的,這是我希望能夠避免的。我需要更新的應用程序非常強大,雖然它很舊,但我仍然需要每六個月更新一次,並且由於公司要求而無法更新框架(錯誤...)這似乎不是可怕的黑客,但黑客是我傾向於在生產代碼中不惜一切代價避免的東西。 – RLH