我最近问了这个问题: Compiler error referencing custom C# extension method
Marc Gravell的回答很完美,它解决了我的问题。但它让我有所思考......
如果和Extension方法必须放在静态类上,并且方法本身必须是静态的,为什么我们不能创建静态扩展方法?
我理解标记为“this”的参数将用于允许访问我们正在扩展的对象的实例。我不明白为什么不能创建一个静态的方法......在我看来,这是一个无意义的限制......
我的问题是:为什么我们不能创建一个可以作为静态方法使用的扩展方法?
答案 0 :(得分:7)
我希望真正的答案很简单:没有一个好的用例。例如,优点是它能够在现有类型(本身不提供逻辑)的基础上实现流畅的API - 即。
var foo = data.Where(x=>x.IsActive).OrderBy(x=>x.Price).First();
启用LINQ:
var foo = (from x in data
where x.IsActive
order by x.Price
select x).First();
使用静态方法,这根本不是问题,所以没有理由;只需在第二种类型上使用静态方法。
实际上,扩展方法并非正确面向对象 - 它们是一种实用的滥用方式,以牺牲纯度为代价,使生活更轻松。没有理由以同样的方式稀释静态方法。
答案 1 :(得分:3)
因为C#中不存在该功能。
作为一种解决方法,静态方法可以在另一个类中实现,并通过该类调用以提供添加的功能。
例如,XNA有一个MathHelper类,理想情况下它是Math类的静态扩展。
如果我们认为C#4.0是个好主意,那么社区是asking
答案 2 :(得分:1)
我的想法是兼容性 - 如果你突然对所有静态方法扩展方法都需要使用this运算符,你可能会无意中破坏现在用扩展方法覆盖普通方法的代码。
此参数允许控制,因此不会破坏兼容性。
只是一个想法。
答案 3 :(得分:0)
首先,您必须添加另一种语法,以指示您要扩展现有类型的静态方法。在扩展语法时,你真的需要这么做的理由。
假设我有一个名为MyExts的类,它允许我向MyClass添加扩展方法。为什么: -
MyClass.DoSomethingExtra();
优于
MyExts.DoSomethingExtra();