看看FSharpPlus我正在考虑如何创建一个用于的泛型函数
let qr0 = divRem 7 3
let qr1 = divRem 7I 3I
let qr2 = divRem 7. 3.
Run Code Online (Sandbox Code Playgroud)
并提出了一个可能的(工作)解决方案
let inline divRem (D:^T) (d:^T): ^T * ^T = let q = D / d in q, D - q * d
Run Code Online (Sandbox Code Playgroud)
然后我看了FSharpPlus如何实现它,我发现:
open System.Runtime.InteropServices
type Default6 = class end
type Default5 = class inherit Default6 end
type Default4 = class inherit Default5 end
type Default3 = class inherit Default4 end
type Default2 = class inherit Default3 end …Run Code Online (Sandbox Code Playgroud) 以下F#代码
let f<'T when 'T: (member Id:int)> (t:'T) = t.Id
不接受以下错误:
错误FS0670此代码不够通用.^ T :(成员get_Id:^ T - > int)时的类型变量^ T无法一般化,因为它会逃避其范围.
怎么了?怎么解决?
编辑
@Fyodor:很棘手!我做了一些测试,发现更多的陌生感:
let inline f1<^T when ^T: (member Id:int)> (t:^T) = ( ^T: (member Id:int) t )
let inline f2<'T when 'T: (member Id:int)> (t:'T) = ( 'T: (member Id:int) t )
let inline f3<'T when 'T: (member Id:int)> (t:'T) = ( ^T: (member Id:int) t )
let inline f4 t = ( ^T: (member Id:int) t )
Run Code Online (Sandbox Code Playgroud)
f1在<^ T中给出错误 …
在 ASP.NET 8 容器的日志中,我找到了此条目
[22:38:50 WRN] Overriding HTTP_PORTS '8080' and HTTPS_PORTS ''. Binding to values defined by URLS instead 'http://+:80'. # {"EventId": {"Id": 15}, "SourceContext": "Microsoft.AspNetCore.Hosting.Diagnostics"}
Run Code Online (Sandbox Code Playgroud)
我不明白 HTTP_PORTS 设置来自哪里,因为我能想到的配置源都没有设置它。
我有一个 Xamarin.Forms Android 应用程序,使用 Visual Studio 2017 开发。如果我从 Visual Studio 运行/调试应用程序,使用 USB 设备,它运行良好(调试和发布配置)。
然后我使用 Visual Studio 中的存档命令创建 .apk。为了测试它,我只需从我的开发人员上传它。计算机到谷歌驱动器,然后从同一设备下载并安装它。这也有效。
当我尝试从命令行创建 .apk 时,问题就出现了。以这种方式获得的文件被设备识别,并正确安装它,但是当我启动应用程序时,它似乎启动但一秒钟后突然关闭。我什至没有得到我在开发阶段出现异常时遇到的熟悉的弹出窗口“不幸的是应用程序停止了”。
这些是我使用的命令:
msbuild /t:Clean /p:Configuration=Release
msbuild /t:PackageForAndroid /p:Configuration=Release
keytool -genkey -v -keystore SymCheck.keystore -alias SimCheck -keyalg RSA -keysize 2048 -validity 10000
jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore SymCheck.keystore my_application.apk SimCheck
根据https://docs.microsoft.com/en-gb/xamarin/android/deploy-test/signing/manually-signing-the-apk
我也试过这个序列
msbuild /t:Clean /p:Configuration=Release
msbuild /t:PackageForAndroid /p:Configuration=Release
keytool -genkey -v -keystore SymCheck.keystore -alias SimCheck -keyalg RSA -keysize 2048 -validity 10000
zipalign.exe -f -v 4 my_application.apk my_application_aligned.apk
apksigner.bat …
我有这个基本的生成F#类型提供者
[<TypeProvider>]
type MyTypeProvider(config : TypeProviderConfig) as this =
inherit TypeProviderForNamespaces(config)
let ns = "MyNamespace"
let asm = Assembly.LoadFrom(config.RuntimeAssembly)
let buildTypes (typeName:string) (args:obj[]) =
let asm = ProvidedAssembly()
let srvName = args.[0] :?> string
... omitted
let provided = ProvidedTypeDefinition(asm, ns, typeName, Some typeof<MyRuntimeType>, hideObjectMethods = true, nonNullable = true, isErased = false)
let ctor = ProvidedConstructor([], (fun _ -> <@@ MyRuntimeType() @@>))
provided.AddMember(ctor)
provided
let parameters =
[ ProvidedStaticParameter("Host", typeof<string>, "") ]
let provider = ProvidedTypeDefinition(asm, ns, "MyProvider", Some …Run Code Online (Sandbox Code Playgroud) 我正在使用 Blazor javascript 互操作(js 调用 .NET),如下所示
//js
dotNetObjRef.invokeMethodAsync("DotNetMethod", jsObject);
---------------------------------------------------------
//C#
[JSInvokable]
public void DotNetMethod(object jsObject)
{
Console.WriteLine($"jsObject type is {jsObject.GetType()}");
}
Run Code Online (Sandbox Code Playgroud)
在浏览器控制台中,我得到:
'jsObject type is SimpleJson.JsonObject'
Run Code Online (Sandbox Code Playgroud)
现在我想将 jsObject 转换为具体的 SimpleJson.JsonObject,如下所示
[JSInvokable]
public void DotNetMethod(object jsObject)
{
JsonObject jsObject = (JsonObject)jsObject; //error
}
Run Code Online (Sandbox Code Playgroud)
但我使用 SimpleJson 的 C# 社区实现(如https://github.com/facebook-csharp-sdk/simple-json)的所有试验都失败,抱怨强制转换无效。
作为解决方法,我浏览字符串:
//js
dotNetObjRef.invokeMethodAsync("DotNetMethod", JSON.stringify(jsObject));
.
//C#
[JSInvokable]
public void DotNetMethod(string jsObjectJSON)
{
JsonObject jsObject = SimpleJson.DeserializeObject<JsonObject>(jsObjectJSON);
}
Run Code Online (Sandbox Code Playgroud)
有谁知道是否可以(以及如何)直接使用接收到的 jsObject,即避免序列化/反序列化(并且不进行反射)?
我有一个像这样定义的类类型:
type T1(?maybei1: int, ?maybei2: int) =
Run Code Online (Sandbox Code Playgroud)
以下所有工作:
let t11 = T1(1, 2)
let t12 = T1(1)
let t13 = T1()
Run Code Online (Sandbox Code Playgroud)
但这个没有(如预期的那样):
let tuple = (1, 2)
let t14 = T1 tuple //error: expected int but given int * int
Run Code Online (Sandbox Code Playgroud)
另一方面,如果我将我的类型定义为:
type T2(i1: int, i2: int) =
Run Code Online (Sandbox Code Playgroud)
然后我可以通过元组构造一个实例
let tuple = (1, 2)
let t24 = T2 tuple //ok
Run Code Online (Sandbox Code Playgroud)
但我失去了选择权:
let t22 = T2(1) //error
let t23 = T2() //error
Run Code Online (Sandbox Code Playgroud)
我尝试了一个额外的构造函数:
type T3(?maybei1: int, ?maybei2: int) =
new (i1: int, …Run Code Online (Sandbox Code Playgroud) 让我们考虑客户端 blazor 应用程序中的以下页面:
@page "/test"
<div id="modalDialog" class="modal" tabindex="-1" role="dialog">
<div class="modal-dialog" role="document">
<div class="modal-content">
<div class="modal-body">
<EditForm Model="@model" OnSubmit="@SubmitHandler">
<div class="form-group d-flex justify-content-between">
<label class="col-form-label col-3" for="editDT">Time</label>
<InputText bind-Value="@model" id="editDT" Class="form-control" />
</div>
<button type="submit" class="btn btn-primary" @*data-dismiss="modal"*@>Submit</button>
</EditForm>
</div>
</div>
</div>
</div>
<button data-toggle="modal" data-target="#modalDialog" class="btn btn-primary">Open</button>
@functions {
private string model { get; set; } = "Model";
private void SubmitHandler()
{
Console.WriteLine("Submit");
}
}
Run Code Online (Sandbox Code Playgroud)
当我单击“打开”按钮时,模态会按预期显示。然后单击模式中的提交按钮,“提交”再次按预期打印在浏览器控制台中。但我还需要在单击“提交”时关闭模态,以便取消对数据关闭属性的注释。现在,模态按预期关闭,但不再调用 Submit 处理程序(浏览器控制台保持为空)。
1)这是预期的行为吗?
2)如果是,有没有办法在没有javascript互操作的情况下关闭提交处理程序中的模式?
3)如果没有,是否有另一种方法可以关闭模态并在单击提交按钮时调用提交处理程序,再次没有js互操作?
参考在 F# 中是否有等效于 C# 的 nameof(..)?
在以下情况下如何使用或扩展函数名称?
let nameof (q:Expr<_>) =
match q with
| Patterns.Let(_, _, DerivedPatterns.Lambdas(_, Patterns.Call(_, mi, _))) -> mi.Name
| Patterns.PropertyGet(_, mi, _) -> mi.Name
| DerivedPatterns.Lambdas(_, Patterns.Call(_, mi, _)) -> mi.Name
| _ -> failwith "Unexpected format"
let any<'R> : 'R = failwith "!"
let s = _nameof <@ System.Char.IsControl @> //OK
type A<'a>() =
static member MethodWith2Pars(guid:Guid, str:string) = ""
static member MethodWith2Pars(guid:Guid, ba:byte[]) = ""
let s1 = nameof <@ A<_>.MethodWith2Pars @> …Run Code Online (Sandbox Code Playgroud) 根据这个文章,我应该能够从 Chrome devtools 控制台运行提取请求。事实上,如果我单击帖子答案中的按钮,它就会起作用。
但是,如果我尝试在控制台中执行完全相同的代码,则它不起作用。
fetch('https://jsonplaceholder.typicode.com/posts/1')
.then(res => res.json())
.then(console.log)
Run Code Online (Sandbox Code Playgroud)
少了什么东西?
javascript google-chrome fetch google-chrome-devtools google-developers-console