1

当 C# 函数中的命名参数丢失时,编译器仅打印丢失的参数数量,而不是打印函数中每个丢失参数的名称:

prog.cs(10,27): error CS1501: No overload for method `createPrism' takes `2' arguments`.

但是,出于调试目的,通常需要获取函数调用中缺少的参数的名称,尤其是对于带有许多参数的函数。是否可以在 C# 函数调用中打印缺少的参数?

using System;
public class Test{
    public static int createPrism(int width, int height, int length, int red, int green, int blue, int alpha){
        //This function should print the names of the missing parameters
        //to the error console if any of its parameters are missing. 

        return length*width*height;
    }
    static void Main(){
        Console.WriteLine(getVolume(length: 3, width: 3));
        //I haven't figured out how to obtain the names of the missing parameters in this function call.
    }
}
4

2 回答 2

1

我能想到的唯一想法是使用可选参数:

public static int createPrism(int width = -1, int height = -1, int length = -1, int red = -1, int green = -1, int blue = -1, int alpha = -1){
    if(width == -1)
        Console.WriteLine("Invalid parameter 'width'");
    if(height == -1)
        Console.WriteLine("Invalid parameter 'height'");
    ...

    return length*width*height;
}

这将在以下情况下打印出正确的结果:

createPrism(length: 3, width: 3);

但是,没有什么可以阻止用户编写这样的内容:

createPrism(width: -1, height: -1);

alex的回答是另一种同样有效的形式。诀窍是确保默认值不是有效的参数值。


另一种技术是使用参数字典

public static int createPrism(Dictionary<string, int> parameters){
    if(!parameters.ContainsKey("width"))
        Console.WriteLine("Missing parameter 'width'");
    if(!parameters.ContainsKey("height"))
        Console.WriteLine("Missing parameter 'height'");
    ...

    return parameters["length"] * parameters["width"] * parameters["height"];
}

但是调用它变得非常麻烦:

createPrism(new Dictionary<string, int>() { { "length", 3 }, { "width", 3 } });

dynamic您可以使用参数类型在某种程度上克服这个问题:

public static int createPrism(dynamic parameters){
    if(parameters.GetType().GetProperty("width") == null)
        Console.WriteLine("Invalid parameter 'width'");
    if(parameters.GetType().GetProperty("height") == null)
        Console.WriteLine("Invalid parameter 'height'");
    ...

    return parameters.length * parameters.width * parameters.height;
}

变成:

createPrism(new { length: 3, width: 3 });

尽管最终,最好的选择就是让编译器完成它的工作。您的原始声明足以确保调用代码已为您的函数成功返回提供了所有必要的参数。一般来说,如果函数可以在没有给定参数的情况下执行,它应该是可选的(通过默认值或忽略它的重载),编译器将处理其余部分。您应该担心的是调用者提供的是否有效。

于 2013-07-01T22:37:15.530 回答
1

您可以使所有参数为空并将它们设置为默认值。然后,在您的方法中,您可以检查哪些参数具有空值并对其进行处理。

   public static int createPrism(int? width=null, int? height=null){
       if(!height.HasValue){
         Console.Write("height parameter not set")
       }
   }
于 2013-07-01T22:32:07.607 回答