Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么StaticallyResolvedTypeParameter方法在运行时失败时调用compile?_C#_.net_F#_Inline_Static Typing - Fatal编程技术网

C# 为什么StaticallyResolvedTypeParameter方法在运行时失败时调用compile?

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);

我刚刚编写了一个C#可以看到的简单方法,但在运行时调用它(即使使用有效的参数)会出现问题

运行时失败的示例:

F#:

消费者:

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#as
var inlinedAdd=Library1.MyModule.add(1,2)调用内联
函数-这让我惊讶-也许编译器可以创建一个备份非内联版本?让我惊讶的是人们对一个答案投了赞成票,这个答案需要一个简单的add函数来反驳。C#调用这个编译器。另外,下面的代码编译并运行
let inline add x y=x+y
从C#as
var 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();  
}