小编Shr*_*roy的帖子

无法在C#中将通用类型转换为列表

我正在尝试进行一个简单的测试,在其中我将两个通用对象传递给测试函数,看看它们是否可以强制转换List<S>,并进一步检查列表的计数是否相等.

以下代码有效:

private static void Test<T> (T obj1, T obj2) {
    if (typeof(T).IsGenericType) {
        var genericTypeParam1 = typeof(T).GetGenericArguments().First();
        Console.WriteLine(genericTypeParam1);

        // LINE MARKER 1
        // var obj1AsList = (obj1 as IEnumerable<genericTypeParam1>);
    }
}

static void Main(string[] args) {
    Test(Enumerable.Range(0, 5).ToList(), Enumerable.Range(0, 5).ToList());
    Console.ReadLine();
}
Run Code Online (Sandbox Code Playgroud)

但如果我取消注释标记的行LINE MARKER 1,我会收到以下错误:

The type or namespace name 'genericTypeParam1' could not be found (are you missing a using directive or an assembly reference?)
Run Code Online (Sandbox Code Playgroud)

我事先不知道Test会收到Lists.但我的意图是先检查是否obj1obj2可作为列表,然后进行比较

var obj1AsList = …
Run Code Online (Sandbox Code Playgroud)

c# generics

5
推荐指数
1
解决办法
430
查看次数

F#代码性能可怕

这是我的第一个F#计划.我以为我会把Conway的生命游戏作为第一个练习.

请帮助我理解为什么下面的代码有如此可怕的性能.

let GetNeighbours (p : int, w : int, h : int) : seq<int> =
    let (f1, f2, f3, f4) = (p > w, p % w <> 1, p % w <> 0, p < w * (h - 1))
    [
    (p - w - 1, f1 && f2);
    (p - w, f1);
    (p - w + 1, f1 && f3);
    (p - 1, f2);
    (p + 1, f3);
    (p + w - 1, f4 && f2);
    (p …
Run Code Online (Sandbox Code Playgroud)

recursion performance f# sequences

4
推荐指数
1
解决办法
633
查看次数

将大序列作为函数参数传递

这真是一个简单的问题(但我似乎无法在MSDN文档中找到答案).

如果我在F#中将大型序列和对象作为函数参数传递,它们是否总是按值复制,除非我提供了byref关键字?问题是,我无意修改参数,但同时,我不想每次调用函数时都要复制大对象.

f# pass-by-reference pass-by-value

4
推荐指数
2
解决办法
1119
查看次数

C++ 11是否确实优化了lambdas中的尾递归调用?

我的试探性答案是否定的,如以下测试代码所示:

#include <functional>
#include <iostream>
#include <string>
#include <vector>

using namespace std;

void TestFunc (void);
int TestFuncHelper (vector<int>&, int, int);

int main (int argc, char* argv[]) {
    TestFunc ();
    return 0;
} // End main ()

void TestFunc (void) {
    // Recursive lambda
    function<int (vector<int>&, int, int)> r = [&] (vector<int>& v_, int d_, int a_) {
        if (d_ == v_.size ()) return a_;
        else return r (v_, d_ + 1, a_ + v_.at (d_));
    };
    int UpperLimit = 100000; …
Run Code Online (Sandbox Code Playgroud)

c++ lambda tail-call-optimization c++11

3
推荐指数
1
解决办法
1116
查看次数

在F#中,如何将类型名称作为函数参数传递?

我想传递一个类型名称(例如int,或者string,甚至是用户定义类型的名称)作为函数参数.目前我正在做以下事情:

type IntegerOrIntegerList =
    | Integer of int
    | IntegerList of int list

let f (n : int) (d : 'T) : IntegerOrIntegerList =
    match (box d) with
    | :? int as i -> Integer(n)
    | _ -> IntegerList([0 .. n])
Run Code Online (Sandbox Code Playgroud)

但上述存在d是偶然的.表达上述逻辑的惯用F#方式是什么?

在此先感谢您的帮助.

parameters f# types

3
推荐指数
1
解决办法
1796
查看次数

使TcpListener异步处理连接的正确方法是什么?

对不起,很长的帖子.我想TcpListener用来监听端口,处理不同(后台)线程中传入连接所请求的繁重工作,然后在准备就绪时将响应发送回客户端.我在MSDN上阅读了很多代码和示例,并为服务器提出了以下实现.

对于以下所有实现,请假设以下变量:

let sva = "127.0.0.1"
let dspt = 32000

let respondToQuery (ns_ : NetworkStream) (bta_ : byte array) : unit =
    // DO HEAVY LIFTING
    ()
Run Code Online (Sandbox Code Playgroud)

IMPLEMENTATION 1(普通的同步服务器;我从这个MSDN页面翻译代码)

let runSync () : unit =
    printfn "Entering runSync ()"
    let (laddr : IPAddress) = IPAddress.Parse sva
    let (svr : TcpListener) = new TcpListener (laddr, dspt)
    try
        svr.Start ()
        let (bta : byte array) = Array.zeroCreate<byte> imbs
        while true do
            printfn "Listening on port …
Run Code Online (Sandbox Code Playgroud)

f# asynchronous tcplistener async-await

3
推荐指数
1
解决办法
438
查看次数

为什么专门研究monad的类型会导致错误?

以下计算序列无错误地运行:

type Monad_1 () =
    member M.Bind (so : 'T option, bf : 'T -> 'T option) : 'T option =
        match so with
        | Some s -> bf s
        | None -> None
    member M.Delay (df : unit -> 'T) : 'T = // SEE CORRECTION 1
        df ()
    member M.Return (rv : 'T) : 'T option =
        Some rv

let test_1 () : unit =
    let m_1 = Monad_1 ()
    let cero =
        m_1 {
            let x1 = …
Run Code Online (Sandbox Code Playgroud)

monads f# computation-expression

3
推荐指数
1
解决办法
114
查看次数

无法定义运算符

我有以下简单类型:

module Structures
    type Point2D<'T> (x : 'T, y : 'T) =
        member this.X = x
        member this.Y = y
        member this.IsEqualTo (p : Point2D<'T>) =
            (this.X = p.X) && (this.Y = p.Y)
Run Code Online (Sandbox Code Playgroud)

但Visual Studio(2012试用版)在名称"IsEqualTo"下放置一条红色波浪线,在"this.X"下放置一条蓝色波浪线.

红色波浪线的错误消息如下:

通用成员IsEqualTo已在此程序点之前的非均匀实例化中使用.考虑重新排序成员,以便首先发生此成员.或者,明确指定成员的完整类型,包括参数类型,返回类型和任何其他通用参数和约束.

蓝线的消息是:

类型参数缺少约束'when'T:equality'

我已经尝试在所有其他成员之前放置"IsEqualTo",但错误仍然存​​在.

我猜这个错误与=登录this.X = p.X工作在泛型类型上的事实有关,'T但我似乎无法纠正它.

预先感谢您的帮助.

generics f#

2
推荐指数
1
解决办法
114
查看次数

System.OutOfMemoryException用于尾递归函数

我已将有问题的代码隔离到此函数(使用ASP.NET的Membership类):

let dbctx = DBSchema.GetDataContext()
let rec h1 (is2_ : int) (ie2_ : int) : unit =
    match is2_ >= ie2_ with
    | true ->
        let st2 = query {
            for row in dbctx.Tbl_Students do
            where (row.Id = is2_)
            head}
        let l2 =
            Membership.FindUsersByEmail (st2.Email_address)
            |> Seq.cast<_>
            |> Seq.length
        match l2 >= 1 with
        | true -> 
            ()
        | false ->
            Membership.CreateUser (st2.Email_address, password, st2.Email_address)
            |> ignore
        h1 (is2_ - 1) ie2_
    | false ->
        ()
Run Code Online (Sandbox Code Playgroud)

System.OutOfMemoryException经过几次5626迭代后我才得到了 …

f# tail-recursion asp.net-membership tail-call-optimization

2
推荐指数
2
解决办法
278
查看次数

无法连接到本地计算机上的套接字

我在这里做了一个简单的C#代码示例翻译:

let socket_CreateBindListen (sv_ : string) (pt_ : int) : Socket option =
    let (he : IPHostEntry) = Dns.GetHostEntry(sv_)
    let rsock, ipe =
        he.AddressList
        |> Seq.map (fun s ->
            let (ipe2 : IPEndPoint) = new IPEndPoint (s, pt_)
            let (rsock2 : Socket) = new Socket (ipe2.AddressFamily, SocketType.Stream, ProtocolType.Tcp)
            rsock2.Connect ipe2 ///// <---- No connection could be made because the target machine actively refused it
            rsock2, ipe2)
        |> Seq.find (fun (s, t) -> s.Connected)
    try
        rsock.Bind ipe …
Run Code Online (Sandbox Code Playgroud)

sockets f#

2
推荐指数
2
解决办法
1665
查看次数