【问题标题】:How do i catch the CS7036 error我如何捕获 CS7036 错误
【发布时间】:2019-01-30 04:39:45
【问题描述】:

所以我是 C# 的新手,我一直在通过将我的代码从 python 转换为 C# 来学习。现在我偶然发现的问题是:我如何捕获 CS7036 错误。它在 python 中称为“AttributeError”,如果您尝试实例化一个类,而没有所需数量的参数,就会发生这种情况。

public Vector Crossproduct(Vector other)
{
    try
    {
        List<double> output = new List<double>()
        {
            Y* other.Z - other.Y * Z,0 - (X * other.Z- other.X * Z),X* other.Y - other.X * Y
        };
        Vector outputvector = new Vector(output);
        return outputvector;
    }
    catch (Exception)
    {

        throw;
    }
}

我用谷歌搜索了这个,发现这个错误几乎没有任何内容。这是微软 C# 文档的链接。Herehere.

我的问题不在于如何修复错误,而是如何捕捉它,所以我很清楚。

【问题讨论】:

  • 既然这在 C# 中是可能的,所以没有必要在运行时捕获它!
  • CS7036 不是运行时抛出的异常。这是一个编译器错误。这就是你抓不到它的原因。
  • 尝试在不提供参数的情况下实例化一个类,看看会发生什么。编译器不允许这样做。
  • 为什么将无效参数传递给构造函数是有意义的?
  • 非常感谢大家!正如我所说,我是 C# 的新手。这肯定会对我有很大帮助。

标签: javascript c#


【解决方案1】:

C# 是一种编译语言,因此您不必“捕获”此类错误,因为编译器会为您捕获它。如果您尝试在没有所需参数的情况下调用类构造函数,您的代码将无法编译。

【讨论】:

    【解决方案2】:

    您在这里误解了一些基本的东西。编译器错误不是运行时异常;他们是编译器告诉你代码是不合法的根本。由于非法代码一开始就永远不会运行,因此无法在运行时捕获编译器错误;这是违法的!

    现在,在 C# 中有 种情况,在运行时会生成涉及 dynamic 的编译器错误。也就是说:C# 有一个子系统,允许它与动态语言(例如 Python 或 JavaScript)进行互操作。使用该功能时,通常会在编译时做出的决定会延迟到运行时,而在那种情况下,您实际上可能处于必须在运行时捕获编译器错误的情况。

    你不在那种情况下,而且很少有涉及构造函数的动态情况。如果您将来遇到这种情况,您要捕获的异常是RuntimeBinderException

    如果您对此主题感兴趣,请参阅 How does having a dynamic variable affect performance? 了解有关 dynamic 工作原理的一些想法。

    【讨论】:

    • 并非所有编译器都拒绝编译非法代码。例如,Eclipse Java 编译器允许您编译包含语法错误的代码。请注意,在生产代码中使用此功能是一个糟糕的主意。老实说,在开发过程中有人甚至会使用该功能,这感觉很奇怪。
    • @Brian:早在 1990 年代,我就曾在一个 JavaScript 编译器上工作,该编译器的模式允许几乎所有 any 程序编译,并且会做出最大努力的猜测.作为一个演示,我们将通过它运行 Visual Basic 程序,有时,它们的工作原理是一样的!但在我看来,让 JavaScript 极其宽容错误的设计选择是一个糟糕的选择。这意味着没有两个浏览器实现了相同的语言,从而大大增加了 Web 开发人员的测试负担。最好从一开始就让 JS 变得非常严格。
    猜你喜欢
    • 1970-01-01
    • 2022-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-17
    • 2013-09-22
    相关资源
    最近更新 更多