关于以下代码是否应该产生编译器警告的一个问题(它没有).它声明了两个相同名称/返回类型的方法,一个具有默认值的附加命名/可选参数.
注意:从技术上讲,分辨率并不含糊,因为规则明确规定第一种方法将被调用.请参见此处,重载分辨率,第三个要点.毫无疑问,这种行为对我来说也很直观.
public void Foo(int arg) { ... }
public void Foo(int arg, bool bar = true) { ...}
Foo(42); // shouldn't this give a compiler warning?
Run Code Online (Sandbox Code Playgroud)
我认为编译器警告在这里会很直观.虽然代码在技术上是干净的(无论是声音设计是一个不同的问题:)).
我正在尝试实现灵活的调试宏/函数库,而命名/可选参数似乎是实现这些函数的最佳方式.
有没有更好的方法在c中进行命名参数然后如下?
enum named_args {NAME,ADRESS,AGE,NA_SENTINEL};
void named_arg_initializers(struct person p, enum * named_args)
{
enum named_args * current_name;
enum named_args * current_arg;
...
if(named_args==NULL)
return;
current_name = named_args[0];
current_arg = named_args[1];
while(current_name!=NA_SENTINEL)
{
current_name+=2;
current_arg+=2;
if(current_name==NAME)
p.name=current_arg;
else if(...
...
}
...
}
...
}
Run Code Online (Sandbox Code Playgroud) 在这个页面上,Scott Hanselman展示了两个来自Micro-ORMs Dapper和Massive的例子,Massive-example引起了我的兴趣,因为我看不出他们如何实现这种语法.
示例如下,我将在几行而不是一行中断它:
var tbl = new Products();
var products = tbl.All(where: "CategoryID = @0 AND UnitPrice > @1",
orderBy: "ProductName", limit: 20, args: 5,20);
^----+---^
|
+-- this
Run Code Online (Sandbox Code Playgroud)
他们是如何实现这种语法的,允许args有多个值?我假设params基于参数,因为这是允许的唯一的事情,但我不明白他们是如何构建允许的方法,因为在我看来我尝试的所有内容最终都抱怨命名参数并修复位置参数的顺序错误.
我尝试了这样的测试方法:
public static void Test(string name, int age, params object[] args)
{
}
Run Code Online (Sandbox Code Playgroud)
然后使用命名参数:
Test(age: 40, name: "Lasse", args: 10, 25);
Run Code Online (Sandbox Code Playgroud)
但我得到的只是:
在指定了所有固定参数后,必须出现命名参数规范
所以很明显这是错误的.此外,我无法在源头看到任何允许这样做但也许我在错误的地方看.
我在这里错过了什么?
我正在阅读有关C#4.0的一些演示文稿,最后演示者使用以下代码发布了一个测验.
using System;
class Base {
public virtual void Foo(int x = 4, int y = 5) {
Console.WriteLine("B x:{0}, y:{1}", x, y);
}
}
class Derived : Base {
public override void Foo(int y = 4, int x = 5) {
Console.WriteLine("D x:{0}, y:{1}", x, y);
}
}
class Program {
static void Main(string[] args) {
Base b = new Derived();
b.Foo(y:1,x:0);
}
}
// The output is
// D x:1, y:0
Run Code Online (Sandbox Code Playgroud)
我无法弄清楚为什么产生输出(没有演示者离线阅读演示文稿的问题).我在期待
D x:0, y:1
Run Code Online (Sandbox Code Playgroud)
我在网上搜索找到答案,但仍然无法找到答案.有人可以解释一下吗?
这不是关于正确编码实践的问题,我只是在研究语义.假设我有以下构造函数......
public FooClass(string name = "theFoo")
{ fooName = name; }
public FooClass(string name, int num = 7, bool boo = true) : this(name)
{ fooNum = num; fooBool = boo; }
Run Code Online (Sandbox Code Playgroud)
因此可以使用命名参数......?
FooClass foo1 = new FooClass(num:1);
Run Code Online (Sandbox Code Playgroud)
//我只传递一个命名参数,依靠选项来处理其余的事情
或者没有参数调用构造函数FooClass(string,int,bool)?如......
FooClass foo2 = new FooClass();
Run Code Online (Sandbox Code Playgroud) 当Resharper与自己争论时,如何知道哪个角色更可信?
我想我发现一些代码确实让Resharper感到困惑(这显然是一个非常不寻常的案例 - 在使用它一天之后,我认为Resharper是蜜蜂的膝盖/自从液化面包以来最好的东西等).
使用这行代码:
ICryptoTransform Encryptor = RijndaelCipher.CreateEncryptor(SecretKey.GetBytes(32), SecretKey.GetBytes(16));
Run Code Online (Sandbox Code Playgroud)
Resharper告诉我"添加参数名称'rgbkey'"然后"添加参数名称'rgbIV'"
那么那条线就是:
ICryptoTransform Encryptor = RijndaelCipher.CreateEncryptor(rgbKey: SecretKey.GetBytes(32), rgbIV: SecretKey.GetBytes(16));
Run Code Online (Sandbox Code Playgroud)
然而,当我再次运行Resharper时,它说,
"冗余参数名称规范" - "删除参数名称规范"(rgbkey)(然后是rgbIV).
似乎两种方式都可行,但......
c# resharper cryptography optional-parameters named-parameters
可能重复:
在传递给方法时是否按顺序评估参数?
说我有
void foo (int x, int y)
并通过以下方式调用:
foo(y: genNum(), x: genNum())
在这种情况下,C#是否保证x和y的评估顺序?
**kwargs在C#中是否存在某种类似Python的东西?我希望能够将可变数量的命名参数传递给functon,然后将它们作为类似于字典的内部函数并循环遍历它们.
我正在使用Scala 2.11.2.
如果我有这个Fraction类:
case class Fraction(numerator: Int, denominator: Int) {}
Run Code Online (Sandbox Code Playgroud)
然后这给出了一个错误:
val f = new Fraction(numerator=-1, denominator=2)
Run Code Online (Sandbox Code Playgroud)
但这不是:
val f = new Fraction(-1, denominator=2)
Run Code Online (Sandbox Code Playgroud)
错误消息是:
Multiple markers at this line
- not found: value
numerator
- not found: value
numerator
Run Code Online (Sandbox Code Playgroud)
我尝试在其他片段中使用负数而得到相同的结果,但文档中没有提到这是不可能的.
难道我做错了什么?
谢谢
我是来自Python背景的JavaScript的新手.在Python中,参数可以作为键和值传递:
def printinfo( name, age = 35 ):
print "Name: ", name
print "Age ", age
return;
Run Code Online (Sandbox Code Playgroud)
然后可以这样调用该函数:
printinfo( age=50, name="miki" )
printinfo( name="miki" )
Run Code Online (Sandbox Code Playgroud)
这些参数可以在JavaScript函数中传递吗?
我希望能够传递一个或多个参数.例如一个JavaScript函数:
function plotChart(data, xlabel, ylabel, chart_type="l"){
...
}
Run Code Online (Sandbox Code Playgroud)
我希望能够只传递数据和图表类型,标签是可选的,例如:
plotChart(data, chart_type="pie")
Run Code Online (Sandbox Code Playgroud)
这可以用JavaScript吗?
named-parameters ×10
c# ×4
c#-4.0 ×3
c ×1
cryptography ×1
function ×1
inheritance ×1
javascript ×1
massive ×1
overloading ×1
resharper ×1
scala ×1