当缺少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.
}
}
答案 0 :(得分:1)
您可以将所有参数置为可空,并将它们设置为默认值。然后,在您的方法中,您可以检查哪些参数具有null值并对其执行某些操作。
public static int createPrism(int? width=null, int? height=null){
if(!height.HasValue){
Console.Write("height parameter not set")
}
}
答案 1 :(得分: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 });
虽然最终,最好的选择只是让编译器完成它的工作。您的原始声明足以确保调用代码为您的函数提供了成功返回的所有必要参数。通常,如果函数可以在没有给定参数的情况下执行,那么它应该是可选的(通过默认值或省略它的重载),编译器将处理其余的事情。您应该担心的是调用者提供的值是否有效。