无法使用“这个”;在成员初始值设定项中?

发布于 2024-08-17 06:59:53 字数 505 浏览 4 评论 0原文

这合法吗?它是否包含隐藏的错误或缺陷? Visual Studio 不会给出任何错误或警告,但 ReSharper 会给出:

/// <summary>
/// immutable tuple for two
/// </summary>
public class Pair<TValue1, TValue2> : Singleton<TValue1>
{
    public TValue2 Value2 { get; private set; }
    public Pair(TValue1 value1, TValue2 value2, Func<Pair<TValue1, TValue2>, String> toStringFunc)
        : this(value1, value2, () => toStringFunc(this)) { } //Red light

}2> : Singleton<TValue1>

Is this legal? Does it contain a hidden bug or flaw? Visual studio does not give any errors or warnings but ReSharper does:

/// <summary>
/// immutable tuple for two
/// </summary>
public class Pair<TValue1, TValue2> : Singleton<TValue1>
{
    public TValue2 Value2 { get; private set; }
    public Pair(TValue1 value1, TValue2 value2, Func<Pair<TValue1, TValue2>, String> toStringFunc)
        : this(value1, value2, () => toStringFunc(this)) { } //Red light

}2> : Singleton<TValue1>

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

烦人精 2024-08-24 06:59:53

我很确定我听说这是一个编译器错误,在下一版本中修复。我刚刚启动我的 4.0 VM,使用一个更简单的测试用例:

class Foo {
    public Foo() : this(delegate { this.Bar(); }) { }
    public Foo(Action foo) {}
    public void Bar() {}
}

在 VS2008 中工作,但在 VS2010 中工作:

错误 1 ​​关键字“this”在当前上下文中不可用

I'm pretty sure I've heard that this is a compiler bug, fixed in the next release. I'm just firing up my 4.0 VM, with a simpler test-case:

class Foo {
    public Foo() : this(delegate { this.Bar(); }) { }
    public Foo(Action foo) {}
    public void Bar() {}
}

works in VS2008, but in VS2010:

Error 1 Keyword 'this' is not available in the current context

水溶 2024-08-24 06:59:53

这是 C# 3 编译器中的一个错误,已在 C# 4 中修复。

编辑:
在基本构造函数中使用 lambda 表达式的极端情况< /a>

This is a bug in the C# 3 compiler that is fixed in C# 4.

Edit:
Corner case in using lambdas expression in base constructor

江城子 2024-08-24 06:59:53

你的构造函数将永远循环,直到弹出堆栈。这是因为它不断递归地调用自身。尝试将其拆分:

public Pair(TValue1 value1, TValue2 value2)
    : this(value1, value2, () => toStringFunc(this)) { }

public Pair(TValue1 value1, TValue2 value2, Func<Pair<TValue1, TValue2>, String> toStringFunc)
    { /* some actual logic */ }

Your constructor will loop forever, until it pops the stack. This is because it keeps calling itself recursively. Try splitting it up:

public Pair(TValue1 value1, TValue2 value2)
    : this(value1, value2, () => toStringFunc(this)) { }

public Pair(TValue1 value1, TValue2 value2, Func<Pair<TValue1, TValue2>, String> toStringFunc)
    { /* some actual logic */ }
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文