相关疑难解决方法(0)

为什么"as T"会出错,但是使用(T)进行转换不会出错?

我为什么这样做:

public T GetMainContentItem<T>(string moduleKey, string itemKey)
{
    return (T)GetMainContentItem(moduleKey, itemKey);
}
Run Code Online (Sandbox Code Playgroud)

但不是这个:

public T GetMainContentItem<T>(string moduleKey, string itemKey)
{
    return GetMainContentItem(moduleKey, itemKey) as T;
}
Run Code Online (Sandbox Code Playgroud)

它抱怨我没有足够的限制泛型类型,但我认为该规则也适用于使用"(T)"进行转换.

c# generics casting

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

有没有令人信服的理由反对使用C#关键字"as"?

我发现使用以下内容:

TreeViewItem i = sender as TreeViewItem;
if(i != null){ ... }
Run Code Online (Sandbox Code Playgroud)

比以下更容易编写和理解:

if(sender.GetType() == typeof(TreeViewItem)){
    TreeViewItem i = (TreeViewItem)sender;
    ...
}
Run Code Online (Sandbox Code Playgroud)

有没有令人信服的理由使用第一个结构?

.net c# types casting as-keyword

7
推荐指数
3
解决办法
527
查看次数

"前缀"和"as"演员

这似乎是一个关于铸造的非常愚蠢的问题,但......

我有以下设置:

主类中有许多类派生.在某个时间点和空间,我得到一个项目,并希望将其作为子类的对象处理.

Asume:

class subClassA : mainclass 
class subClassB : mainclass 
Run Code Online (Sandbox Code Playgroud)

现在我有一些问题,问它是哪一堂课:

if(someObject is subClassA)
{
    subClassA aA = someObject as subClassA ;
}
Run Code Online (Sandbox Code Playgroud)

虽然对于大多数子类,返回正确的对象,但我得到一个子类a null-Object.

如果我执行以下操作:

if(someObject is subClassA)
{
    subClassA aA = someObject as subClassA ; // <- aA = null; someObject is shown in debugger as object of subClassA

    object test = someObject as subClassA; // <- object is not null
    // or 
    subClassA aB = (subClassA)someObject; // <- object is not null, shows the …
Run Code Online (Sandbox Code Playgroud)

c# casting type-conversion

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

如何将Animal实例转换为Dog实例?

说我有以下课程:

class Animal
{
    public long Id { get; set; }
    public string Name { get; set; }
}

class Dog:Animal
{
    public void sniffBum()
    {
        Console.WriteLine("sniff sniff sniff");
    }
}
Run Code Online (Sandbox Code Playgroud)

如果我有一个实例Animal,我该如何将其转换为Dog?像这样的东西:

Animal a = new Animal();
if ( some logic to determine that this animal is a dog )
{
    Dog d = (Dog)a;
    d.sniffBum();
}
Run Code Online (Sandbox Code Playgroud)

基本上我不能使用接口.我将永远有一个Animal像我这样的数据库.Dog没有任何参数Animal,只有新方法.

我可以创建一个新Dog对象,并传递值,(或者有一个带有类型的构造函数Animal),但这看起来很麻烦.

c# oop inheritance

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

'as'关键字的用例

我想知道,在这种情况下你会使用C#的'as'关键字,而不是转换和检查异常?考虑这个例子:

Parent obj = new Child();

// Method 1:
try
{
    Child result1 = (Child)obj;
}
catch (InvalidCastException)
{
    // Handle failed cast
}

// Method 2:
if(obj is Child)
{
    Child result2 = obj as Child;
}
else
{
    // Handle failed cast
}
Run Code Online (Sandbox Code Playgroud)

据我所知,方法1和方法2都产生完全相同的结果.我知道,当它们失败时,as关键字将产生null,而一个转换将抛出一个ClassCastException,但对我而言,这似乎不足以让两个几乎相同的方式来转换对象.所以我想知道,为什么C#语言设计师会遇到添加'as'关键字的麻烦?

c#

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

LINQ Any()和Single()与SingleOrDefault()的空检查

在什么情况下每个解决方案优先于另一个?

例1:

if (personList.Any(x => x.Name == "Fox Mulder"))
{
  this.Person = personList.Single(x => x.Name == "Fox Mulder");
}
Run Code Online (Sandbox Code Playgroud)

例2:

var mulder = personList.SingleOrDefault(x => x.Name == "Fox Mulder");

if (mulder != null)
{
  this.Person = mulder;
}
Run Code Online (Sandbox Code Playgroud)

c# linq

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

如何检查该对象是否实现了接口

鉴于这种情况

interface A {}

class B : A {}

A b = new B();
Run Code Online (Sandbox Code Playgroud)

如何检查对象b是否从界面A创建?

c# inheritance types

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

我应该更喜欢"是"还是"作为"运算符?

可能重复:
使用CLR中的'as'关键字进行转换

foreach (MyClass i in x)
{
        if (i is IMy)
        {
                IMy a = (IMy)i;
                a.M1();
        }
}
Run Code Online (Sandbox Code Playgroud)

要么

foreach (MyClass i in x)
{
        IMy a = i as IMy;
        if (a != null)
        {
                a.M1();
        }

}
Run Code Online (Sandbox Code Playgroud)

c#

5
推荐指数
3
解决办法
1159
查看次数

何时使用()与'as'来改变类型?

可能重复:
转换:( NewType)与Object对象作为NewType
Casting vs使用CLR中的'as'关键字

//var gridView = (gridViewRow.NamingContainer as GridView); <-- works too
var gridView = (GridView)gridViewRow.NamingContainer;
Run Code Online (Sandbox Code Playgroud)

我对此的不完全理解是使用as关键字可以null在使用强制转换()时抛出异常.我的目标是能够问自己"我应该选择哪种方式?" 并知道如何回答它.

c# type-conversion

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

使用HttpWebRequest.Create时的C#vs VB语法

我已经在VB中编写了很长一段时间,我也可以在C#和F#中做很多事情,但是VB和C#之间的一个语法差异继续让我失望.我是谷歌这个,但我不确定该怎么称呼它.请考虑以下示例:

在visual basic中我会这样做:

Dim Request As HttpWebRequest = HttpWebRequest.Create("www.google.com")
Run Code Online (Sandbox Code Playgroud)

但是,当我做出似乎是对C#的"逻辑"转换时:

HttpWebRequest Request = HttpWebRequest.Create("www.google.com");
Run Code Online (Sandbox Code Playgroud)

我得到隐式类型转换错误.看了一些其他代码后,我意识到这似乎是正确的方法:

HttpWebRequest Request = (HttpWebRequest)HttpWebRequest.Create("www.google.com");
Run Code Online (Sandbox Code Playgroud)

但是我不清楚在括号中另外提到HttpWebRequest类型的目的是什么.这是某种我不知道的演员语法吗?在这里发生了什么使得这项工作,而不是直接转换?

c# vb.net

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

标签 统计

c# ×10

casting ×3

inheritance ×2

type-conversion ×2

types ×2

.net ×1

as-keyword ×1

generics ×1

linq ×1

oop ×1

vb.net ×1