我最近写了这篇文章并且惊讶于它编译:
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) 我在网上做了很多研究并尝试了一些设置,但是我无法在命令行上重现在Visual Studio 2012中运行MsTest的行为.
我们的解决方案包含许多项目,这些项目构建到位于解决方案级别的相同bin文件夹(例如C:\ MySolution\bin) - 这是被测试代码(CUT).测试分组在一个单独的项目中,该项目驻留在自己的解决方案中,并构建在自己的bin文件夹中(例如C:\ MySolution\Tests\bin).实际上有很多插件,因此我们希望MsTest在运行将所有内容复制到TestResults文件夹的测试内容时引用CUT bin文件夹.我们在Visual Studio 2012中通过编辑.testrunconfig并将".\ bin"指定为" 要加载的程序集的根文件夹 "(在编辑testrunconfig时在"单元测试"选项卡中)来实现此目的.因此,我们可以在VS2012中加载测试解决方案并在那里运行测试,而无需将bin文件夹内容复制到TestResults目录.
现在我想创建一个运行MsTest的.bat文件,就像在VS2012中一样,这样我们就可以省略启动Visual Studio来运行测试.我现在正在研究如何在命令行上执行MsTest,但是非常沮丧.这就是我尝试过的(在VS命令提示符下在解决方案级别执行的命令):
MsTest /testcontainer:Tests\bin\Tests.dll
这根本不起作用,它甚至找不到Tests.dll需要运行的引用dll.所以我重新使用了配置并再次运行它:
MsTest /runconfig:LocalTestRun.testrunconfig /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将testrunconfig中的选项更改为绝对路径(C:\ MySolution\bin)时,它工作正常.我仍然收到许多警告,例如:
警告:测试运行部署问题:未找到测试容器"C:\ MySolution\Tests\bin\tests.dll"直接或间接引用的程序集或模块"....".
但无论如何,指定绝对路径并不是一个真正可行的解决方案.如何在命令行上使用不同但相对的程序集基目录运行MsTest?
我的LocalTestRun.testrunconfig如下:
<?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) 我已经阅读了几个关于这个问题的 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 …
我有简单的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功能都运行良好.
这些天是否有任何非CLS兼容的.NET语言常用?看起来VS2012开箱即用的每种托管语言都支持无符号整数类型,所以实际上可以说在公共/受保护类型签名中使用"unsigned"进行前进的东西有多少麻烦?
看起来CLR,CTS和相关技术在这一点上基本上都已"完成",因此人们想知道CLS合规性对于"现代".NET代码有多大的影响.
我们现在纯粹是出于动力而跳过CLS篮球吗?
我有以下代码
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) 我有这个代码
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# ×2
generics ×2
.net ×1
ambiguity ×1
dynamic ×1
git ×1
git-diff ×1
javascript ×1
mstest ×1
powershell ×1
rust ×1
sql ×1
unit-testing ×1
web-sql ×1
windows ×1