C# 为什么StaticallyResolvedTypeParameter方法在运行时失败时调用compile?
我刚刚编写了一个C#可以看到的简单方法,但在运行时调用它(即使使用有效的参数)会出现问题 运行时失败的示例: F#: 消费者:C# 为什么StaticallyResolvedTypeParameter方法在运行时失败时调用compile?,c#,.net,f#,inline,static-typing,C#,.net,F#,Inline,Static Typing,我刚刚编写了一个C#可以看到的简单方法,但在运行时调用它(即使使用有效的参数)会出现问题 运行时失败的示例: F#: 消费者: namespace ConsoleApplication1 { class Program { var class1 = new Library1.Class1(); // NotSupportedException var result = Library1.MyModule.fOnly(class1);
namespace ConsoleApplication1
{
class Program
{
var class1 = new Library1.Class1();
// NotSupportedException
var result = Library1.MyModule.fOnly(class1);
Console.ReadLine();
}
}
为什么要编译,然后在运行时失败?我是做错了什么,还是应该假设从C#调用方法的任何尝试都会失败?那么我应该吗?在F#中使用
内联
实际上不会在输出程序集中产生函数
该函数编码在一些元数据中,只有F#编译器可以读取这些元数据,然后以内联方式插入
因此,您无法从C#调用
内联
函数。在F#中使用内联
实际上不会在输出程序集中生成函数
该函数编码在一些元数据中,只有F#编译器可以读取这些元数据,然后以内联方式插入
因此,无法从C#调用
内联函数示例中的代码是错误的
Class1
的成员Foo
不是X
,因此无法编译
--------------问题编辑后------------
您可以使用ILSpy查看反编译代码和错误源
反编译C#-
名称空间库1
{
[编译映射(SourceConstructFlags.Module)]
公共静态类MyModule
{
公共静态字符串fOnly(a x)
{
“不支持动态调用get_Foo”;
抛出新的NotSupportedException();
}
公共静态字符串testFOnly()
{
Class1@class=newclass1();
返回“F#”;
}
}
}
但是你可以从代码中看出这是可行的
也没有理由将其作为函数调用
让testFOnly()=fOnly(Class1())
而不是常规绑定,因为它的目标是类的不可变属性
i、 e.让testFOnly=Class1()|>fOnly
示例中的代码是错误的
Class1
的成员Foo
不是X
,因此无法编译
--------------问题编辑后------------
您可以使用ILSpy查看反编译代码和错误源
反编译C#-
名称空间库1
{
[编译映射(SourceConstructFlags.Module)]
公共静态类MyModule
{
公共静态字符串fOnly(a x)
{
“不支持动态调用get_Foo”;
抛出新的NotSupportedException();
}
公共静态字符串testFOnly()
{
Class1@class=newclass1();
返回“F#”;
}
}
}
但是你可以从代码中看出这是可行的
也没有理由将其作为函数调用
让testFOnly()=fOnly(Class1())
而不是常规绑定,因为它的目标是类的不可变属性
i、 e.让testFOnly=Class1()|>fOnly
调用此函数的c编译。另外,下面的代码编译并运行let inline add x y=x+y
从C#asvar inlinedAdd=Library1.MyModule.add(1,2)调用显然你可以从C#?@Maslow调用内联
函数-这让我惊讶-也许编译器可以创建一个备份非内联版本?让我惊讶的是人们对一个答案投了赞成票,这个答案需要一个简单的add函数来反驳。C#调用这个编译器。另外,下面的代码编译并运行let inline add x y=x+y
从C#asvar inlinedAdd=Library1.MyModule.add(1,2)调用
显然你可以从C#?@Maslow调用内联
函数-这让我惊讶-也许编译器可以创建一个备份的非内联版本?让我惊讶的是人们对一个答案投了赞成票,这个答案只需要一个简单的add函数就可以反驳。我的糟糕,只调整了一半的F#,使它对于一个如此简单的问题更具可读性,更新的问题我真的很惊讶它没有将对成员的调用嵌入为内联,而是获取编译时值,如果它指向一个函数而不是一个常量值的属性/字段,可能会做一些更有趣/直观的事情我的错,只调整了一半的F#,使它对SO问题更具可读性,更新的问题我真的很惊讶它没有内嵌对成员的调用,而是获取编译时值,如果它指向一个函数而不是一个具有常量值的属性/字段,也许它会做一些更有趣/直观的事情
namespace ConsoleApplication1
{
class Program
{
var class1 = new Library1.Class1();
// NotSupportedException
var result = Library1.MyModule.fOnly(class1);
Console.ReadLine();
}
}
static void Main ( string [ ] args )
{
Console.WriteLine( Library1.MyModule.testFOnly()) ;
Console.ReadLine();
}