Tag: 重载

使用默认参数重载的构造函数

我不小心在C#中重载了一个构造函数,如下所示: public MyClass(string myString) { // Some code goes here } public MyClass(string myString, bool myParameter = false) { // Some different code here } 使用此代码,我的项目编译得很好。 如果我用一个string参数调用构造函数,C#如何决定我想使用哪个构造函数? 为什么语法允许这个function?

如何使用多态+重载来改进这种方法以减少IS(类型检查)?

例如 BaseClass MyBase() { public int Add(BaseClass next) { if (this is InheritedA && next is InheritedA) return 1; else if (this is InheritedA && next is InheritedB) return 2; else if (this is InheritedB && next is InheritedA) return 3; else if (this is InheritedB && next is InheritedB) return 4; } } 其中InheritedA和InheritedB是其inheritance的类。 […]

通用重载决议

我有以下情况: class Foo { } class Foo : Foo { } 然后是两种方法 void DoStuff(Foo foo) { DoStuffImpl(foo); } void DoStuffImpl(Foo foo) { Console.WriteLine(“A”); } void DoStuffImpl(Foo foo) { Console.WriteLine(“B”); } void Main() { DoStuff(new Foo()); // prints A } (注意,代码是在浏览器中编写的,但描述了我面临的情况) 如何让它调用generics方法,然后打印B? 这可以在没有反思的情况下完成吗? 关于如何用reflection完成,我有一些想法,但我正在寻找一个更清洁的解决方案,如果存在的话。 注意:我不能使DoStuffgenerics,因为它将与WCF一起使用,并且不允许打开generics类型。

为什么类型约束不是方法签名的一部分?

所以我读了Eric Lippert的’Constraints不是签名的一部分’ ,现在我明白规范指定在重载解析后检查类型约束,但我仍然不清楚为什么必须如此。 以下是Eric的例子: static void Foo(T t) where T : Reptile { } static void Foo(Animal animal) { } static void Main() { Foo(new Giraffe()); } 这不会编译因为: Foo(new Giraffe())重载解析推断出Foo是最佳的重载匹配,但是类型约束失败并抛出编译时错误。 用埃里克的话说: 这里的原则是重载决策(和方法类型推断)找到参数列表和每个候选方法的forms参数列表之间的最佳匹配。 也就是说,他们会查看候选方法的签名。 类型约束不是签名的一部分,但为什么不能呢? 在某些情况下,考虑类型约束是签名的一部分是个坏主意吗? 难道或难以实施? 我并不是在提倡如果最佳选择的超载是出于无论什么原因无法调用的话,那么就会默默地回归到第二好的; 我讨厌那个。 我只是想了解为什么不能使用类型约束来影响最佳过载的选择。 我在C#编译器内部想象, 仅用于重载解析(它不会永久重写方法) ,如下所示: static void Foo(T t) where T : Reptile { } 变成了: static void […]

C#params关键字与两个相同类型的参数

我今天刚遇到C#的东西,我以前没想过。 我class上有两种方法,一种是另一种方法的重载。 它们被声明如下: public void RequirePermissions(params string[] permissions)… public void RequirePermissions(string message, params string[] permissions)… 在我的代码中,我试着像这样调用第一个: RequirePermissions(“Permission1”, “Permission2”); …期待它调用第一个重载。 好吧,它称为第二次超载。 在这种情况下,我可以让它调用第一个方法的唯一方法是手动传递一个string[]对象,如下所示: RequirePermissions(new string[] { “Permission1”, “Permission2” }); 现在,这种行为并不会让我感到困惑,因为我知道编译器无法根据我提供的参数告诉我实际想要调用哪种方法。 但我不小心这可能在我的代码中被忽视了。 似乎微软应该在遇到上述情况时让编译器抛出错误。 有没有人对此有任何想法? 除了我发布的“解决方案”之外,还有另一种方法可以调用第一个过载吗?

具有约束的generics方法的重载解决问题

代码示例: interface IFoo { } class FooImpl : IFoo { } static void Bar(IEnumerable value) where T : IFoo { } static void Bar(T source) where T : IFoo { } 任何人都可以解释,为什么这个方法调用: var value = new FooImpl[0]; Bar(value); 目标Bar(T source) (因此,不编译)? 在解决重载时,编译器是否会考虑类型参数约束? UPD 。 避免与数组混淆。 IEnumerable任何实现都会发生这种情况,例如: var value = new List(); UPD 2 。 @ […]

方法重载解决意外行为

我正在与一个奇怪的,至少对我来说,重载.net的分辨率方法摔跤。 我写了一个小样本来重现这个问题: class Program { static void Main(string[] args) { var test = new OverloadTest(); test.Execute(0); test.Execute(1); Console.ReadLine(); } } public class OverloadTest { public void Execute(object value) { Console.WriteLine(“object overload: {0}”, value); } public void Execute(MyEnum value) { Console.WriteLine(“enum overload: {0}”, value); } } public enum MyEnum { First = 1, Second = 2, […]

我可以定义具有相同名称但不同参数的2个代理吗?

我试图在Int32和IntPtr之间定义一个委托覆盖。 为什么以下超载非法? public delegate int EnumWindowsCallback (System.IntPtr hWnd, int lParam); public delegate int EnumWindowsCallback (System.IntPtr hWnd, System.IntPtr lParam); 这看起来很奇怪。 它们都是结构但是不同并且从不同的接口实现。 想想看,我从来没有尝试过代理过代表。 它甚至是合法的,如果是的话,为什么? 更新:在完成答案和更多SOpost之后,我感到困惑的是,即使使用不同数量的参数也无法声明代表。 我仍然想知道为什么在运行时无法解决这个问题。

C# – 如何“重载”代理?

首先,我正在阅读一些论坛和MSDN中的帮助,所有人都说代表不能超载。 现在,我希望有这样的事情: public delegate void OneDelegate(); public delegate void OneDelegate(params object[] a); public void DoNothing(params object[] a) {} public void DoSomething() { /* do something */ } private OneDelegate someFunction; someFunction = new OneDelegate(DoSomething); someFunction = new OneDelegate(DoNothing); 所以,就像你知道的那样,你不能这样做,因为OneDelegate只引用第一个而不是第二个。 但是,有没有办法做到这一点? 或类似的东西? PS1:我想拥有任意数量的OneDelegate声明,而不只是一两个声明。