Не вызывается нужный перегруженный метод
От: Rikomer Россия  
Дата: 30.10.16 09:22
Оценка: :))
Привет

Нашел вот такой кейс.
Суть в том, что вызывается не тот конструктор.
То есть по коду должен вызваться public MonthData(String Month, Int32? DataQty),
а вызывается public MonthData(String Month, Decimal? DataAmt), хотя передается в итоге DataQty.

Убираю x != 1 и всё нормально работает
В чем причина?


  Полноценный пример
using System;
using System.Linq;
using System.Collections.Generic;
using System.IO;
using ConsoleApplication3;

class Solution
{
static void Main(String[] args)
{
var a1 = new MonthData2 { Month = "1", DataAmt = 10.00m, DataQty = 20 };
var a2 = new MonthData2 { Month = "1", DataAmt = 20.00m, DataQty = 30 };
var a3 = new MonthData2 { Month = "1", DataAmt = 30.00m, DataQty = 40 };

var arr = new List<MonthData2>();
arr.AddRange(new[] { a1, a2, a3 });

var x = 1;
var arr2 = arr.Select(a => new MonthData(a.Month,
x != 1 ? (Decimal?)a.DataAmt : (Int32?)a.DataQty))
.ToList();

Console.ReadLine();
}


public class MonthData
{
public MonthData(String Month, Int32? DataQty)
{
this.Month = Month;
this.DataQty = DataQty;

}

public MonthData(String Month, Decimal? DataAmt)
{
this.Month = Month;
this.DataAmt = DataAmt;
}

public readonly String Month;
public readonly Int32? DataQty;
public readonly Decimal? DataAmt;
}

public class MonthData2
{
public String Month;
public Int32? DataQty;
public Decimal? DataAmt;
}
}
Re: Не вызывается нужный перегруженный метод
От: kov_serg Россия  
Дата: 30.10.16 09:28
Оценка: +1
Здравствуйте, Rikomer, Вы писали:

R>В чем причина?


var arr2 = arr.Select(a=> x!=1 
  ? new MonthData(a.Month,(Decimal?)a.DataAmt) 
  : new MonthData(a.Month,(Int32?)a.DataQty)
).ToList();


Так попробуйте
Re: Не вызывается нужный перегруженный метод
От: TK Лес кывт.рф
Дата: 30.10.16 14:26
Оценка: +1
Здравствуйте, Rikomer, Вы писали:

R>Привет


R>Нашел вот такой кейс.

R>Суть в том, что вызывается не тот конструктор.
R>То есть по коду должен вызваться public MonthData(String Month, Int32? DataQty),
R>а вызывается public MonthData(String Month, Decimal? DataAmt), хотя передается в итоге DataQty.

R>Убираю x != 1 и всё нормально работает


Если убрать x != 1 то, код не скомпилируется

R>В чем причина?


Почитайте про оператор ?:
Если у Вас нет паранойи, то это еще не значит, что они за Вами не следят.
Re: Не вызывается нужный перегруженный метод
От: Mr.Delphist  
Дата: 31.10.16 14:28
Оценка: +1
Здравствуйте, Rikomer, Вы писали:

R>Убираю x != 1 и всё нормально работает

R>В чем причина?

Тернарный оператор — это не просто инлайновый if. Там есть сайд-эффект: обе ветки должны возвращать выражение одного и того же типа. Если б возвращались тёплое или мягкое, то ошибка сразу бы стала очевидной (не могу привести тёплое и мягкое к одному типу). Тут же — числовые типы, вот компилятор их неявно и "причесал" одной гребёнкой под Decmial. А раз тип стал фактически один (а не два), то вторая сигнатура (целочисленная) выпала из кода, и бряки там не срабатывают.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.