小编And*_*eas的帖子

具有多种泛型类型的C#中的泛型导致允许和不允许的歧义

我最近写了这篇文章并且惊讶于它编译:

public class MyGeneric<U, V> {
  MyGeneric(U u) { ... }
  MyGeneric(V v) { ... }
  public void Add(U u, V v) { ... }
  public void Add(V v, U u) { ... }
}
Run Code Online (Sandbox Code Playgroud)

如果我按如下方式使用这个类,如果我调用Add,我会得到一个"不明确的构造函数引用"和一个"不明确的调用".

var myVar = new MyGeneric<int, int>(new MyIntComparer());
Run Code Online (Sandbox Code Playgroud)

显然,当我使用int和double作为泛型类型时,没有歧义,当然,当我同时使用两个int时,它们也都会分配给double.

var myVar = new MyGeneric<int, double>(new MyIntComparer());
myVar.Add(3, 5);
Run Code Online (Sandbox Code Playgroud)

所以我认为以下也是允许的,但令人惊讶的是我收到了一个错误.为什么以下不允许编译?

public interface IMyInterface<T, S> {
  void Add(T t, S s);
}

public class MyGeneric<U, V> : IMyInterface<U, V>, IMyInterface<V, U> {
  public MyGeneric(U u) { } …
Run Code Online (Sandbox Code Playgroud)

c# generics ambiguity

6
推荐指数
1
解决办法
330
查看次数

使用自定义程序集基目录从命令行运行MsTest

我在网上做了很多研究并尝试了一些设置,但是我无法在命令行上重现在Visual Studio 2012中运行MsTest的行为.

我们的解决方案包含许多项目,这些项目构建到位于解决方案级别的相同bin文件夹(例如C:\ MySolution\bin) - 这是被测试代码(CUT).测试分组在一个单独的项目中,该项目驻留在自己的解决方案中,并构建在自己的bin文件夹中(例如C:\ MySolution\Tests\bin).实际上有很多插件,因此我们希望MsTest在运行将所有内容复制到TestResults文件夹的测试内容时引用CUT bin文件夹.我们在Visual Studio 2012中通过编辑.testrunco​​nfig并将".\ bin"指定为" 要加载的程序集的根文件夹 "(在编辑testrunco​​nfig时在"单元测试"选项卡中)来实现此目的.因此,我们可以在VS2012中加载测试解决方案并在那里运行测试,而无需将bin文件夹内容复制到TestResults目录.

现在我想创建一个运行MsTest的.bat文件,就像在VS2012中一样,这样我们就可以省略启动Visual Studio来运行测试.我现在正在研究如何在命令行上执行MsTest,但是非常沮丧.这就是我尝试过的(在VS命令提示符下在解决方案级别执行的命令):

MsTest /testcontainer:Tests\bin\Tests.dll

这根本不起作用,它甚至找不到Tests.dll需要运行的引用dll.所以我重新使用了配置并再次运行它:

MsTest /runco​​nfig:LocalTestRun.testrunco​​nfig /testcontainer:Tests\bin\Tests.dll

它仍然没有用.它可以开始测试,但所有测试都失败了.我收到了很多类似的警告

警告:测试运行部署问题:未找到测试容器"C:\ MySolution\Tests\bin\tests.dll"直接或间接引用的程序集或模块"....".

最后它说:

已配置的应用程序基目录'C:\ MySolution\TestResults\User_Machine 2013-07-28 13_16_59\Out\bin'不存在.将改为使用测试目录.

当我applicationBaseDirectory将testrunco​​nfig中的选项更改为绝对路径(C:\ MySolution\bin)时,它工作正常.我仍然收到许多警告,例如:

警告:测试运行部署问题:未找到测试容器"C:\ MySolution\Tests\bin\tests.dll"直接或间接引用的程序集或模块"....".

但无论如何,指定绝对路径并不是一个真正可行的解决方案.如何在命令行上使用不同但相对的程序集基目录运行MsTest?

我的LocalTestRun.testrunco​​nfig如下:

<?xml version="1.0" encoding="UTF-8"?>
<TestSettings name="Local Test Run" id="...." xmlns="http://microsoft.com/schemas/VisualStudio/TeamTest/2010">
  <Description>This is a default test run configuration for a local test run.</Description>
  <Deployment>
    <DeploymentItem filename="Tests\....\Resources\" />
  </Deployment>
  <Execution hostProcessPlatform="MSIL">
    <TestTypeSpecific>
      <UnitTestRunConfig testTypeId="....">
        <AssemblyResolution applicationBaseDirectory=".\bin">
           <TestDirectory useLoadContext="true" />
        </AssemblyResolution> …
Run Code Online (Sandbox Code Playgroud)

unit-testing mstest visual-studio visual-studio-2012

6
推荐指数
1
解决办法
5506
查看次数

git diff 的输出在 powershell 中没有正确处理

我已经阅读了几个关于这个问题的 QA,但没有一个提供答案。有一个变通方法,我在这里再次说明,但我想了解并解决问题。

问题

问题是git diff reva revb | Out-File mypatch.patch在 powershell中执行命令会产生“垃圾字符”来代替德语元音变音(?ñ 而不是 ä)。

调查

当我按照$Env:LESSCHARSET="utf8"某些 QA 中的建议执行时,我确实在终端中获得了正确的输出,但是一旦将其重定向到文件mypatch.patch,变音符号(和其他字符)就会被破坏。甚至git --no-pager diff reva revb会在终端中产生正确的输出。但是,一旦您想将其通过管道传输到文件,那就错了。你看到的不是你得到的!

在我看来,输入到Out-File已经被破坏,因此设置-Encoding参数不会改变任何东西。我不认为Out-File是这里的罪魁祸首。例如,该命令$mypatch = git diff reva revb(即使在 diff 之前添加了 --no-pager)会导致一个变量,例如欧元符号或变音符号在该变量被打印到终端时出现错位(Ôé¼ 而不是 €)。

我在 Windows 10 (1709) 上尝试了 powershell 5.1 和开源 powershell core 6.0.4。我使用 git 2.18.0.windows.1。它适用于 windows 命令行 (cmd),因此简单的解决方法是从 powershell 控制台调用:

解决方法

cmd /c "git diff reva revb > mypatch.patch"

这仅适用于 PowerShell …

windows git powershell git-diff character-encoding

6
推荐指数
1
解决办法
1184
查看次数

使用WebSQL.如何将新列添加到现有表?

我有简单的WebSQL数据库,有1个表和3列.我想再添加一列,但如果数据库已经存在,我就无法做到.只有在我在缓存中清理它之后才有可能,但后来我丢失了所有数据.

如何在不删除数据库的情况下向表中添加新列?

// database creating
MYDB.init.open = function(){
       MYDB.init.db = openDatabase("MYDB","1.0"," super-data-base",1024*1024*5);
}


//table creating    
MYDB.init.createTable = function(){
           var database = MYDB.init.db;
           database.transaction(function(tx){
                  tx.executeSql("CREATE TABLE IF NOT EXISTS mytable (ID INTEGER PRIMARY KEY ASC,item TEXT,description TEXT)", []);
           });
    }

//
//a lot of code for adding datas and reading datas
//

//database updating that does not work
MYDB.init.updateTable = function(){
       var database = MYDB.init.db;
       database.transaction(function(tx){
              tx.executeSql("ALTER TABLE mytable ADD time VARCHAR NOT NULL BEFORE description");
       });
}
Run Code Online (Sandbox Code Playgroud)

所有其他UPDATE功能都运行良好.

javascript sql web-sql

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

是否有常见的非CLS兼容.NET语言?

这些天是否有任何非CLS兼容的.NET语言常用?看起来VS2012开箱即用的每种托管语言都支持无符号整数类型,所以实际上可以说在公共/受保护类型签名中使用"unsigned"进行前进的东西有多少麻烦?

看起来CLR,CTS和相关技术在这一点上基本上都已"完成",因此人们想知道CLS合规性对于"现代".NET代码有多大的影响.

我们现在纯粹是出于动力而跳过CLS篮球吗?

.net cls-compliant

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

当T是特征对象时,如何创建Box <T>?

我有以下代码

extern crate rand;
use rand::Rng;

pub struct Randomizer {
    rand: Box<Rng>,
}

impl Randomizer {
    fn new() -> Self {
        let mut r = Box::new(rand::thread_rng()); // works
        let mut cr = Randomizer { rand: r };
        cr
    }

    fn with_rng(rng: &Rng) -> Self {
        let mut r = Box::new(*rng); // doesn't work
        let mut cr = Randomizer { rand: r };
        cr
    }
}

fn main() {}
Run Code Online (Sandbox Code Playgroud)

它抱怨说

error[E0277]: the trait bound `rand::Rng: std::marker::Sized` is not satisfied
  --> src/main.rs:16:21 …
Run Code Online (Sandbox Code Playgroud)

rust trait-objects

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

有没有办法处理未知的泛型类型?

我有这个代码

public interface IConsumable<T> {
  void Consume(T item);
}

public interface IProducer<T> {
  IConsumable<T> Consumer { get; set; }
  void Produce();
}

public class MyClass : MyType, 
  IConsumable<ISpecifcItem>
{
  public void Consume(ISpecificItem item) { ... }
}

public class MySpecificItemProducer
  : IProducer<ISpecificItem> {
  public IConsumable<ISpecificItem> Consumer { get; set; }
  public void Produce() {
    ISpecificItem myItem = new MyVerySpecificItem();
    Consumer.Consume(myItem);
  }
}
Run Code Online (Sandbox Code Playgroud)

然后我有一个控制器,它接受任何MyType,发现IConsumable<>它实现的所有类型,并获得泛型类型参数的类型.通过这个类型列表,它可以发现所有实现的生产者IProducer<TParam>.这并不困难:

var consumerTypes =
    myType.GetType().GetInterfaces()
    .Where(x => x.IsGenericType)
    .Where(x => x.GetGenericTypeDefinition() == …
Run Code Online (Sandbox Code Playgroud)

c# generics dynamic

0
推荐指数
1
解决办法
4952
查看次数