the*_*ist 2 c# .net-framework-version visual-studio-2022
下面是我正在运行的确切代码。为什么编译器返回dynamic而不输入MyClass?
我的项目在 .NET Framework 4.7.2 上运行,但我通过添加public static class IsExternalInit { }和将其配置为使用最新的 C#
<PropertyGroup>
<LangVersion>latest</LangVersion>
</PropertyGroup>
Run Code Online (Sandbox Code Playgroud)
我的代码:
internal class Program
{
class MyClass
{
}
static class MyParser
{
public static MyClass Parse(dynamic data)
{
return new MyClass();
}
}
static void Do(dynamic data)
{
var parsedObj = MyParser.Parse(data);
...
}
static void Main(string[] args)
{
Do(JsonConvert.DeserializeObject(""));
}
}
Run Code Online (Sandbox Code Playgroud)
\n\n为什么编译器
\ndynamic应该返回特定类型时却返回?
这个问题预设了一个谎言。编译器的行为是正确的,因此询问为什么它应该做不正确的事情使得很难回答您的问题。
\n相反,我将回答“规范的哪一部分确定编译器何时应将调用分类为动态调用?”的问题。
\n我建议您参阅规范的第 11.7.8.1 节,其中规定:
\n\n\n\n如果至少满足以下条件,则调用表达式会动态绑定 (\xc2\xa711.3.3):
\n\n
\n- Primary_Expression 具有编译时类型动态。
\n- 可选参数列表中至少有一个参数具有编译时类型动态。
\n在这种情况下,编译器将 invoking_expression 分类为\n动态类型的值。
\n
data是“至少一个参数”,其类型为dynamic,所以就这样了。
在您的特定情况下,适用有关附加错误检查的部分 - 但此部分不会影响调用类型的分类。
\n\n如果您的“为什么”问题没有通过参考规范得到回答,那么我鼓励您将其重新表述为“什么”问题。 很难知道“为什么”问题何时得到了满意的回答。
\n| 归档时间: |
|
| 查看次数: |
411 次 |
| 最近记录: |